2009-01-29 132 views
32

我有一个字符串变量,表示自定义类的名称。例如:将字符串转换为类名称

string s = "Customer"; 

我需要创建客户的数组列表。所以,需要的语法是:

List<Customer> cust = new .. 

如何将字符串s转换为能够在运行时创建此数组列表?

+0

John,.NET框架中没有ArrayList类的通用实现。 Bob,这个问题已经超出了范围,但是如果你使用C#2.0+进行编程,你应该用ArrayList替代通用的东西。 – senfo 2009-01-29 23:12:47

回答

55

那么,对于一件事ArrayList是不是通用的......你的意思是List<Customer>

您可以使用Type.GetType(string)通过名称获取与类型关联的对象Type。如果程序集不是mscorlib或当前正在执行的类型,则需要包含程序集名称。无论哪种方式,你也需要命名空间。

你确定你确实需要泛型类型吗?泛型通常提供编译时间类型安全性,如果在执行时发现类型,显然你不会有太多的东西。您可以发现它很有用,但...

Type elementType = Type.GetType("Customer"); 
Type listType = typeof(List<>).MakeGenericType(new Type[] { elementType }); 

object list = Activator.CreateInstance(listType); 

如果你需要做任何与列表中,你可能需要做更多的普通反射,但...例如调用通用方法。

+0

如何将对象转换为具体类型?我试过使用List concreteType,但这不起作用? – KingOfHypocrites 2012-04-04 14:04:19

10

这是一个反思问题。你需要找到的类型,然后实例化它的一个实例,是这样的:

Type hai = Type.GetType(classString,true); 
Object o = (Activator.CreateInstance(hai)); //Or you could cast here if you already knew the type somehow 

,或者的CreateInstance(的AssemblyName,类名)

您将需要虽然注意命名空间/类型的冲突,但这将为一个简单的场景做诀窍。

另外,在try/catch中包装! Activator.CreateInstance是可怕的!