2

在 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))

请确认?

4

2 回答 2

4

有几个重载Activator.CreateInstance使您能够做到这一点。但是,您必须手动将字符串拆分为类型名称和程序集名称。

更新:您自己对此的看法也是正确的(尽管方法是Type.GetType())。

于 2012-12-12T14:47:46.897 回答
0

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

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

但是您需要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

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

于 2012-12-12T14:48:42.810 回答