【问题标题】:Converting a string to a class name将字符串转换为类名
【发布时间】:2021-05-03 03:22:02
【问题描述】:

我有一个代表自定义类名称的字符串变量。示例:

string s = "Customer";

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

List<Customer> cust = new .. 

如何转换字符串 s 才能在运行时创建这个数组列表?

【问题讨论】:

  • John,.NET 框架中没有 ArrayList 类的通用实现。 Bob,这超出了问题的范围,但是如果您使用 C# 2.0+ 进行编程,则应该将 ArrayList 替换为通用的。

标签: c# .net


【解决方案1】:

嗯,一方面ArrayList 不是通用的……你是说List&lt;Customer&gt; 吗?

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

你确定你真的需要一个泛型类型吗?泛型主要提供 compile-time 类型安全性,如果您在执行时查找类型,显然您不会有太多安全性。您可能会发现它很有用...

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

object list = Activator.CreateInstance(listType);

如果您需要对该列表任何操作,您可能需要进行更通用的反射...例如调用泛型方法。

【讨论】:

  • 如何将对象转换为具体类型?我试过使用 ListconcreteType 但这不起作用?
  • @KingOfHypocrites:对象本身的类型正确的类型。 变量的类型不能是,因为你在编译时不知道。
【解决方案2】:

这是一个反思问题。您需要找到类型然后实例化它的一个实例,如下所示:

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, className)

您需要注意命名空间/类型冲突,但这对于一个简单的场景来说是可行的。

另外,将其包装在 try/catch 中! Activator.CreateInstance 好吓人!

【讨论】:

    猜你喜欢
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2011-05-24
    • 1970-01-01
    相关资源
    最近更新 更多