我有一个关于如何可能的问题(如果可能的话:) 使用Type.GetType()返回的类型引用,例如,创建该类型的IList?
这是示例代码:
Type customer = Type.GetType("myapp.Customer");
IList<customer> customerList = new List<customer>(); // got an error here =[
提前谢谢你!
答案 0 :(得分:22)
这样的事情:
Type listType = typeof(List<>).MakeGenericType(customer);
IList customerList = (IList)Activator.CreateInstance(listType);
当然你不能将其声明为
IList<customer>
因为它没有在编译时定义。但是List<T>
实现了IList,所以你可以使用它。
答案 1 :(得分: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);
}
希望我没有让这一切变得令人困惑,它实际上也有帮助,也很抱歉文字墙
答案 2 :(得分:0)
您的问题的解决方案由Stefan提供。
您无法执行IList<customer>
的原因是因为您无法以这种方式混合编译时和运行时类型。
当我尝试推理类似这样的事情时的暗示是:intellisense如何确定它必须显示的成员。在您的示例中,这只能在运行时解决。
可以使用Stefan给出的答案。但是我觉得它对你的潜在问题没有帮助,因为它没有给你智能感知。所以我认为你只使用非通用列表没有优势。