从类型定义字符串实例化System.Type

时间:2012-12-12 14:45:18

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

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

请确认?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

使用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

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