如何在程序中使用.NET类型字符串?
-
01-10-2019 - |
题
例如,在.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
.