在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))
请确认?
答案 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>