1

例如,在 .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.
}
4

3 回答 3

4

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

您可以调用该Activator.CreateInstance方法来创建一个类型的实例。(假设该类型有一个公共的默认构造函数,或者你知道它需要什么构造函数参数)。

例如:

Activator.CreateInstance(Type.GetType(name));
于 2010-09-07T18:53:53.527 回答
0

这些部分通常由 Visual Studio 设置设计器创建/访问。

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

于 2010-09-07T18:56:38.433 回答
0

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

当然,如果您要创建实例的类型在构建时是已知的,您应该只引用包含它的程序集并使用new. ConfigurationManager但是,Activator CreateInstance如果您想实现CreateInstanceFromType来自同一个字符串。

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

于 2010-09-07T19:02:34.957 回答