【问题标题】:How to instantiate an interface, with a generic parameter如何使用泛型参数实例化接口
【发布时间】:2015-10-06 00:27:03
【问题描述】:

我有一些类实现了下面的接口:

ISearchBase<T>

但我不知道要实例化哪个类,所以我让“用户决定”,如下例:

var objectResponse = Activator.CreateInstance(Type.GetType(ResponseNamespace));

问题是: 每个这些类都有一个返回,我试图这样使用:

var object = (ISearchBase<objectResponse >)
          Activator.CreateInstance(Type.GetType(Namespace));

但是编译器不允许我这样做……我该怎么办?

错误是:

找不到类型或命名空间名称“objectResponse”。

【问题讨论】:

  • 编译器会给你什么错误?
  • 你不能实例化接口。您肯定需要为您的帖子添加一些清晰度。
  • 你不能做var object = (ISearchBase&lt;X&gt;)...,除非你在编译时知道X
  • @BetaSystems-RodrigoDuarte 因为不清楚你真正想要实现什么,那么 Enigmativity 的答案确实是唯一可能的答案。
  • @BetaSystems-RodrigoDuarte - 是的,不能这样做。如果我们知道你接下来要如何处理object,可能会有办法绕过它。

标签: c# interface


【解决方案1】:

当您执行var object = (ISearchBase&lt;X&gt;)... 时,您必须在编译时知道X 的类型。 var 关键字只是编译器推断类型的简写。因此,您不能使用运行时类型来解析X

在创建 object 之后,您还没有展示如何处理它。当然可以使用反射调用泛型方法以允许您编写类型安全的代码,但如果不查看更多代码,我无法判断这是否对您有用。

【讨论】: