c# - 实例化一个实现通用接口(interface)的类

标签 c# reflection

我有一个用于指定 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 类型的对象是不够的。

我怎样才能得到这样的对象呢?一些工厂还是什么?

最佳答案

  1. 您混淆了工厂和实体。这是不必要的——GetData 真的没有意义是 BTAC 上的实例方法.
  2. Activator.CreateInstance返回 object - 您需要明确地将其转换为您想要的类型。
  3. 你的类型都没有实现 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/

相关文章:

c# - MvxTabBarViewController 作为第一个 ViewController 没有出现

c# - 如何取消通过数据绑定(bind)所做的更改?

c# - 如何在警报 javascript 中正确显示此字符串

c# - 使用反射在结构和类之间复制等效属性

c# - 从字符串变量中的名称创建类的对象实例

java - 使用反射调用 Type 参数化方法

c# - 如何防止字符串被拦截

c# - 在 C#.NET 中动态转换为类型

c# - 通过反射访问 protected 字段时出现 FieldAccessException

c# - 为什么我应该在每个 aspx 页面中包含 namespace ?