如何在程序中使用.NET类型字符串?

时间:2010-09-07 18:51:13

标签: c# .net reflection late-binding

例如,在.NET app.config中,您可能会得到

<configuration>
   <configSections>
      <section name="MyConfig" type="MyAssembly.MyType, MyAssembly, PublicKeyToken=null" />
   </configSections>
   ...
</configuration>

类型部分中的签名似乎在各种.NET位置标准化,但我不知道如何在我自己的程序中执行此操作。我在我的程序中使用过System.Activator,但感觉就像是在复制.NET已经完成的工作。

在编程方面,我该怎么做:

void Main()
{
   object instance = CreateInstance("MyAssembly.MyType, MyAssembly, PublicKeyToken=null");
   Console.WriteLine(instance.GetType().Name);
}

object CreateInstance(string dotNetTypeSignature)
{
   // Code goes here.
}

3 个答案:

答案 0 :(得分:4)

您可以调用Type.GetType method获取具有给定(程序集限定)名称的Type对象。

您可以调用Activator.CreateInstance method来创建类型的实例。 (假设该类型具有公共默认构造函数,或者您知道它所采用的构造函数参数)。

例如:

Activator.CreateInstance(Type.GetType(name));

答案 1 :(得分:0)

通常使用visual studio设置设计器创建/访问这些部分。

在解决方案资源管理器中查看Properties-&gt; Settings.settings下,或右键单击项目名称 - > gt; Properties-&gt; Settings。

答案 2 :(得分:0)

完整类型名称通常用于对特定类型进行“延迟”绑定。在您拥有的配置文件示例中,实际的配置节类型在CLR构建时是未知的,因此ConfigurationManager必须从配置文件中读取实际类型并在运行时对其进行实例化。正如您所提到的,这是使用System.Activator类完成的,它是跨.Net世界的标准方法。

当然,如果要在构建时知道要创建实例的类型,则应该只引用包含它的程序集并使用new。但是,如果要实现ConfigurationManager之类的运行时可扩展性,则应使用Activator CreateInstanceCreateInstanceFrom方法,这些方法具有允许您通过的覆盖从您使用的任何配置读取的确切字符串,或Type的实例,也可以从同一个字符串创建。

当然,还有另一方面,您的可扩展性点的任何实现都需要写出完整的类型名称。为此,您可以使用typeof(MyType).FullNamemyInstance.GetType().FullName

相关问题