我有一个用于指定 GetData 方法的接口(interface),该方法通过 ID 返回该类的一个实例
public interface ILabelData<T> {
T GetData(object id);
}
当然还有许多不同的类,它们实现接口(interface)并具有成员:
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 方法。 (它的目的是因为在我拥有所需的实例之后我想获取它的成员和属性。获取成员和属性不是我的问题的一部分。)
ILabelData<object> o = Activator.CreateInstance(type, new object[] { myID });
^^^^^^^^^^^^^^^^^^^^
object data = o.GetData(myID);
问题是编译器错误 Cannot implicitly convert type 'object' to 'ILabelData< object >'
在实例化适当的类之后,当然我也需要成员和属性,所以仅仅返回 ILabelData 类型的对象是不够的。
我怎样才能得到这样的对象呢?一些工厂还是什么?
最佳答案
- 您混淆了工厂和实体。这是不必要的——
GetData
真的没有意义是BTAC
上的实例方法. -
Activator.CreateInstance
返回object
- 您需要明确地将其转换为您想要的类型。 - 你的类型都没有实现
ILabelData<object>
.
问题是,使用原样的代码,ILabelData
是没有意义的通用的!如果您要使用 object
无论如何,从 ILabelData
中删除通用参数就这样做:
var o = (ILabelData)Activator.CreateInstance(type, new object[] { myID });
var data = o.GetData(myID);
拥有通用接口(interface)(和 GetData
方法)只有您实际以这种方式使用它才有意义。
如果您通常直接使用它,并且您只在少数特殊情况下需要这样(为什么?)您还可以使接口(interface)协变:
public interface ILabelData<out T>
{
T GetData(object id);
}
这将允许您实现 ILabelData<BTAC>
在 BTAC
,给你“用户友好”BTAC GetData(object)
方法,同时仍然允许您对 ILabelData<object>
进行显式转换.即使那样,我也会避免这种方法。有味道。
关于c# - 实例化一个实现通用接口(interface)的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30708974/