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

C# 如何在程序中使用.NET类型的字符串?,c#,.net,reflection,late-binding,C#,.net,Reflection,Late Binding,例如,在.NET app.config中,您可能会 <configuration> <configSections> <section name="MyConfig" type="MyAssembly.MyType, MyAssembly, PublicKeyToken=null" /> </configSections> ... </configuration> 可以调用获取具有给定(程序集限定)名称的

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

<configuration>
   <configSections>
      <section name="MyConfig" type="MyAssembly.MyType, MyAssembly, PublicKeyToken=null" />
   </configSections>
   ...
</configuration>
可以调用获取具有给定(程序集限定)名称的
类型
对象

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

例如:

Activator.CreateInstance(Type.GetType(name));
可以调用获取具有给定(程序集限定)名称的
类型
对象

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

例如:

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

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


在解决方案资源管理器中,在属性->设置.Settings下查找,或通过右键单击项目名称->属性->设置。

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


在解决方案资源管理器中,在属性->设置.Settings下查找,或通过右键单击项目名称->属性->设置。

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

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


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

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

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


当然,还有另一方面,扩展点的任何实现都需要写出完整的类型名。要做到这一点,您可以使用
typeof(MyType).FullName
,或者
myInstance.GetType().FullName

,顺便说一下,这称为程序集限定名。谢谢,我将把这个术语添加到我的vocab中。顺便说一下,这称为程序集限定名。谢谢,我会在我的词汇中加入这个词。他问的是一般的那种字符串,而不是那种特定的字符串。此外,没有任何设置设计器可以创建任意的configSection。他询问的是一般类型的字符串,而不是特定的字符串。此外,没有创建任意ConfigSection的设置设计器。如果程序集当前不在AppDomain中,此设置设计器是否处理加载程序集的问题?@Robert Davis-类型的完全限定名还包含完全限定程序集名。如果CLR可以在GAC或程序集搜索路径中找到具有该名称的程序集,它将自动加载该程序集。还有Activator.CreateInstanceFrom方法,除了类型名之外,它还采用显式程序集文件名。如果程序集当前不在AppDomain中,此方法是否处理加载程序集的问题?@Robert Davis-类型的完全限定名还包含完全限定程序集名。如果CLR可以在GAC或程序集搜索路径中找到具有该名称的程序集,它将自动加载该程序集。还有一个Activator.CreateInstanceFrom方法,除了类型名之外,它还采用显式程序集文件名。