在C#中使用Type.GetType()返回的类型

15

我有一个关于如何(如果可能的话 :) 使用Type.GetType()返回的类型引用来创建该类型的IList的问题?

以下是示例代码:

Type customer = Type.GetType("myapp.Customer");
IList<customer> customerList = new List<customer>(); // got an error here =[

提前感谢您!


IList<T> 是一个接口,因此您无法直接实例化它。您需要实例化一个实现了 IList<T> 接口的类型,例如 List<T>。 - Brian Rasmussen
3个回答

24

类似这样:

Type listType = typeof(List<>).MakeGenericType(customer);
IList customerList = (IList)Activator.CreateInstance(listType);
当然你不能将其声明为。
IList<customer>

由于它在编译时没有被定义,但 List<T> 实现了 IList 接口,因此您可以使用它。


3
是的,因为它在编译时没有被定义,所以使用通用的List<>没有太大意义 - 不如使用非通用容器,比如ArrayList。 - Grokys
实际上,您应该将Activator.CreateInstance的结果转换为IList,因为它返回一个对象... - Thomas Levesque
1
@Thomas:谢谢,已经修复了。@Groky:这取决于情况。使用通用列表时,在添加项目时会进行运行时类型检查。或者您需要将其分配给您知道(通过某些上下文)它是相同类型的字段。 - Stefan Steinegger

2

我最近遇到了这个问题...我意识到这是一个老问题,但是认为有人可能会发现我找到的解决方案很有用(使用net 4.0)。 这就是我的安装设置:

public interface ISomeInterface{
     String GetEntityType{ get; }
}

public abstract class BaseClass : ISomeInterface{
     public String GetEntityType { 
          get{ return this.GetType().ToString(); }
     }
}

public class ChildA : BaseClass {  }

public class ChildB : BaseClass {  }

我所做的是创建一个工厂方法:
public static dynamic GetRealType { ISomeInterface param } {
     return Activator.CreateInstance("dllname", param.GetEntityType);
}

创建动态类型的对象是解决我的问题的关键。我通过使用以下方法来推断类型:
public void DoSomething<T>(T param){

     IList<T> list = somecode...
}

这使我能够调用该方法并让 .net 推断类型。

public void myMethod( ISomeInterface param ) {
     dynamic value = Factory.GetRealType ( param );
     DoSomething(value);
}

希望我没有让一切变得混乱,实际上有所帮助。同时,对于这篇长文,抱歉。

0

Stefan已经提供了解决您问题的方案。

您无法使用 IList<customer> 的原因是您不能以这种方式混合编译时和运行时类型。当我尝试推理类似这样的事情时,一个提示是:智能感知如何确定它必须显示哪些成员。在您的示例中,只有在运行时才能解决此问题。

Stefan给出的答案可以使用。但是我认为它对您的根本问题没有帮助,因为它不会给您提供智能感知。因此,我认为您使用非泛型列表没有任何优势。


正如Stefan在他的答案评论中指出的那样,仍然存在优点,例如通用列表可以防止代码将不同类型的对象添加到列表中。但是,您会失去智能感知功能。 - Fredrik Mörk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接