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

时间:2009-05-27 08:26:29

标签: c# generics reflection

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

这是示例代码:

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

提前谢谢你!

3 个答案:

答案 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给出的答案。但是我觉得它对你的潜在问题没有帮助,因为它没有给你智能感知。所以我认为你只使用非通用列表没有优势。