C# 从类型定义字符串实例化System.Type
在web.config文件中,我们看到许多字符串遵循以下模式:C# 从类型定义字符串实例化System.Type,c#,configuration,web-config,configuration-files,configurationmanager,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读取这些信息(我知道如何将其读取为字符串),并想从这个字符串实例化一个类
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))
请确认?有几个重载使您能够执行此操作。但是,您必须手动将字符串拆分为类型名称和程序集名称
更新:您自己对此的看法也是正确的(尽管方法是
Type.GetType()
)。有几个重载使您能够做到这一点。但是,您必须手动将字符串拆分为类型名称和程序集名称
更新:您自己的看法也是正确的(尽管方法是
Type.GetType()
)。使用创建类型实例很简单
出于某种原因,我认为您可以只传递类型名称-您不能;谢谢乔恩指出这一点
但是您需要从类型名称中获取类型。如果类型名称始终是完全限定的(至少是程序集名称),则可以简单地使用:
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
公共类MyClass{
公共MyClass(字符串p1=null,int p2=10,…{}
}
//...
var o=Activator.CreateInstance(typeof(MyClass));//使用
出于某种原因,我认为您可以传递类型名称-您不能;感谢Jon指出这一点
但是您需要从类型名称中获取类型
。如果类型名称始终是完全限定的(至少是程序集名称),那么您可以简单地使用:
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
公共类MyClass{
公共MyClass(字符串p1=null,int p2=10,…{}
}
//...
var o=Activator.CreateInstance(typeof(MyClass));//我没有看到该签名有任何重载,你能提供一个引用吗?我没有看到该签名有任何重载,你能提供一个引用吗?