例如,在.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.
}
有帮助吗?

解决方案

你可以打电话给 Type.GetType 方法 得到一个 Type 具有给定(装配成本合格的)名称的对象。

你可以打电话给 Activator.CreateInstance 方法 创建类型的实例。 (假设该类型具有公共默认构造函数,或者您知道它采用的构造函数参数)。

例如:

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

其他提示

这些部分通常是通过Visual Studio设置设计师创建/访问的。

在“解决方案资源管理器”中,在属性 - > settings.setings.settings或右键单击项目名称 - > properties-> settings下的“探索器”中。

完整类型的名称通常用于对特定类型进行“迟到”的绑定。在您拥有的配置文件示例中,实际配置部分类型在CLR构建时间不知道,因此 ConfigurationManager 必须读取实际类型表格配置文件,并在运行时进行不安。这是使用 System.Activator 正如您所提到的,这是在.NET世界中进行的标准方法。

当然,如果您要创建的类型在构建时间已知,则应仅引用包含它并使用的组件 new. 。但是,如果您想实现像 ConfigurationManager, ,您应该使用 Activator CreateInstance 或者 CreateInstanceFrom 方法,具有覆盖的方法,使您可以将确切的字符串传递为所使用的任何配置的读取,或 Type, ,也可以从同一字符串创建。

当然,在其他方面,您的可扩展点的任何实现都需要写出完整类型的名称。为此,您可以使用 typeof(MyType).FullName, , 或者 myInstance.GetType().FullName.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top