【问题标题】:Instantiate a System.Type from a type definition string从类型定义字符串实例化 System.Type
【发布时间】:2012-11-30 07:11:30
【问题描述】:

在 web.config 文件中,我们看到很多遵循这种模式的字符串:

    type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, 
System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, 
PublicKeyToken=31BF3856AD364E35"

我想从 web.config 中读取此信息(我知道如何将其读取为字符串),并且我想从该字符串中实例化一个类型。

有没有办法做到这一点?

更新

我想我可以这样做

Activator.CreateInstance(System.GetType(stringTypeName))

请确认?

【问题讨论】:

    标签: c# configuration web-config configuration-files configurationmanager


    【解决方案1】:

    Activator.CreateInstance 有几个重载可以让您执行此操作。但是,您必须手动将字符串拆分为类型名称和程序集名称。

    更新:你自己的看法也是正确的(虽然方法是Type.GetType())。

    【讨论】:

      【解决方案2】:

      使用Activator.CreateInstance(Type) 创建一个类型的实例很简单。

      编辑由于某种原因,我虽然你可以只传递类型名称 - 你不能;感谢 Jon 指出这一点。

      但您需要从类型名称中获取Type。如果类型名称始终是完全限定的(至少到程序集名称) - 那么您可以简单地使用:

      Type t = Type.GetType(typeName);
      

      但是,如果找不到类型,则会引发异常。你可能会更好:

      Type t = Type.GetType(typeName, false);
      

      然后:

      object result = null;
      if(t != null)
        result = Activator.CreateInstance(t);
      

      结束编辑

      但是,在某些情况下,该类型可能没有默认构造函数,在这种情况下,您要么必须跳过它(要么从 Activator.CreateInstance 捕获异常,要么先对构造函数进行反射搜索),要么找到一种构建依赖类型的方法(Activator.CreateInstance 也支持带参数的构造函数 - @Jon 的答案包括一个链接)。

      我不相信我在这里建议的这个简单的(Type) 重载适用于具有所有可选参数的构造函数的类型:

      public class MyClass {
         public MyClass(string p1 = null, int p2 = 10, ...) { }
      }
      
      //...
      
      var o = Activator.CreateInstance(typeof(MyClass)); //<-- will fail
      

      因为这不是默认构造函数 - 由编译器将这些构造函数绑定为默认值,方法是将所有默认值提取到对“扩展”版本的调用中。

      【讨论】:

      • 我没有看到该签名有任何过载,您可以提供参考吗?
      猜你喜欢
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      • 2012-12-23
      • 2023-04-07
      • 1970-01-01
      相关资源
      最近更新 更多