【问题标题】:How do I use .NET type strings in my programs?如何在我的程序中使用 .NET 类型字符串?
【发布时间】:2010-09-07 18:51:13
【问题描述】:

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

【问题讨论】:

  • 顺便说一下,这叫做装配限定名称。
  • 谢谢,我会将这个词添加到我的词汇中。

标签: c# .net reflection late-binding


【解决方案1】:

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

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

例如:

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

【讨论】:

  • 如果程序集当前不在 AppDomain 中,是否处理加载程序集?
  • @Robert Davis - 类型的完全限定名称还包含完全限定的程序集名称。如果 CLR 可以在 GAC 或程序集搜索路径中找到具有该名称的程序集,它将自动加载它。还有 Activator.CreateInstanceFrom 方法,除了类型名称外,它还采用显式程序集文件名。
【解决方案2】:

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

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

【讨论】:

  • 他问的是一般的那种字符串,而不是那个特定的字符串。此外,没有设置设计器可以创建任意 configSection。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多