2015-06-08 68 views
2

我有一个接口,用于指定GetData方法,其通过它的ID返回类的一个实例的一类实例化它实现了一个通用接口

public interface ILabelData<T> { 
    T GetData(object id); 
} 

,也有许多不同类的那些谁实现接口,并具有部件当然是:

public class BTAC : ILabelData<BTAC> { 
    // members... 
    // and interface impl: 
    public BTAC GetData(object id) { 
    return null; 
    } 
} 
public class KTAC : ILabelData<KTAC> { 
    // members... 
    // and interface impl: 
    public KTAC GetData(object id) { 
    return null; 
    } 
} 

在一个调用方法中,我想实例化一个BTAC/KTAC/...类并调用它们的GetData方法。 (它的目的是becasue后,我有必要的情况下我想要得到它的成员和属性。获取成员和属性是不是我的问题的一部分。)

ILabelData<object> o = Activator.CreateInstance(type, new object[] { myID }); 
^^^^^^^^^^^^^^^^^^^^ 
object data = o.GetData(myID); 

问题是编译器错误无法隐将类型'object'转换为'ILabelData'< object>'

在实例化正确的类课程后,

我怎样才能得到这样的对象?有些工厂或其他什么?

+4

'CreateInstance'适用于单一类型的单个实例。它不会创建一个对象数组,而是创建一个对象数组。更重要的是,它返回一个“对象”。 –

+0

@ haim770但它不是'List',它是一个类型的单个实例。 –

+0

@ haim770不是真的 - 他试图获取的类型没有实现ILabelData ,它实现了ILabelData 或ILabelData 。 – Luaan

回答

1
  1. 你混了工厂和实体。这是不必要的 - GetDataBTAC上的一个实例方法,这是没有意义的。
  2. Activator.CreateInstance返回object - 您需要明确地将其转换为所需的类型。
  3. 您的类型都不能实现ILabelData<object>

事情是这样的,代码是这样的,根本没有ILabelData通用!如果你想反正有object工作,从ILabelData删除泛型参数,只是这样做:

var o = (ILabelData)Activator.CreateInstance(type, new object[] { myID }); 

var data = o.GetData(myID); 

具有接口(和GetData法),如果你真正使用它的方式一般时才有意义

如果通常直接使用它,你只需要像这样在一些特殊情况下(为什么?),你也可以使接口协:

public interface ILabelData<out T> 
{ 
    T GetData(object id); 
} 

这将让你实现ILabelData<BTAC>BTAC,给你“用户友好型”BTAC GetData(object)方法,同时仍然允许你做明确演员到ILabelData<object>。即使那样,我也会避免这种做法。它闻起来臭臭的。

+0

谢谢,我想我不需要通用接口 – Franziee

0

工作代码在这里。

var instances = (from t in System.Reflection.Assembly.GetCallingAssembly().GetTypes() 
         where t.GetInterfaces().Any(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(ILabelData<>)) 
           && t.GetConstructor(Type.EmptyTypes) != null 
         select Activator.CreateInstance(t)).ToList(); 

     foreach (dynamic item in instances) 
     { 
      var res = item.GetData(1); 
     }