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

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读取这些信息(我知道如何将其读取为字符串),并想从这个字符串实例化一个类

在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));//我没有看到该签名有任何重载,你能提供一个引用吗?我没有看到该签名有任何重载,你能提供一个引用吗?