如何从不同于c#中系统的命名空间中获取类型?

如何从不同于c#中系统的命名空间中获取类型?,c#,reflection,types,namespaces,C#,Reflection,Types,Namespaces,我想在只给类型名称的字符串时创建类型。这里很明显: Type t = System.Type.GetType("System.Double"); 但是,当我尝试从另一个名称空间(如System.Drawing)获取类型时,上述方法不会返回正确的类型。我找到了工作解决方案: Assembly foundAssembly = AppDomain.CurrentDomain.GetAssemblies().SingleOrDefault(assembly => assembly.GetName

我想在只给类型名称的字符串时创建类型。这里很明显:

Type t = System.Type.GetType("System.Double");
但是,当我尝试从另一个名称空间(如
System.Drawing
)获取类型时,上述方法不会返回正确的类型。我找到了工作解决方案:

Assembly foundAssembly = AppDomain.CurrentDomain.GetAssemblies().SingleOrDefault(assembly => assembly.GetName().Name == "System.Drawing");
Type t = foundAssembly.GetType("System.Drawing.Color");

但是,它看起来很纯,我想这样做需要一些时间(
AppDomain.CurrentDomain
在我的例子中有22个程序集,但是乘以10000,这是很重要的)。我们能快点吗?我不是在寻找像
type=typeof(System.Drawing.Color)这样的解决方案
,因为可能我必须将“System.Text.StringBuilder”转换为它的类型,等等…

如果您想实现这一点,必须使用完全限定的类型名(包括程序集)。对于
System.Drawing.Color
(对于.Net 4.0):

System.Drawing.Color,System.Drawing,版本=4.0.0.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a
Type t=Type.GetType(“System.Drawing.Color,System.Drawing,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”);
要获取已加载类型的完全限定名,请使用

t.AssemblyQualifiedName

如果要使其正常工作,必须使用完全限定的类型名(包括程序集)。对于
System.Drawing.Color
(对于.Net 4.0):

System.Drawing.Color,System.Drawing,版本=4.0.0.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a
Type t=Type.GetType(“System.Drawing.Color,System.Drawing,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”);
要获取已加载类型的完全限定名,请使用

t.AssemblyQualifiedName

虽然公认的解决方案正确地回答了这个问题,但我也建议将这些转换缓存到
字典中,其中
字符串是您正在解析的输入,
类型是查找的结果。这将显著提高您的性能,因为反射很慢。

虽然公认的解决方案正确地回答了这个问题,但我还建议将这些转换缓存到
字典中,其中
字符串是您正在解析的输入,
类型是查找的结果。这将显著提高您的性能,因为反射速度很慢。

“但是乘以10000,这就是为什么要加载10.000个程序集?”?你想做什么?@ManfredRadlwimmer没有加载那么多程序集,搜索了那么多次。在我的项目中,我必须经常从字符串到类型进行这种解析。程序集的数量可能会增加。对于
Type.GetType(string typeName)
typeName
参数,我不理解从中对我的博文btwQuoting进行向下投票:要获取的类型的程序集限定名。请参阅AssemblyQualifiedName。如果类型在当前正在执行的程序集中或在Mscorlib`.dll中,则提供由其名称空间限定的类型名就足够了。@YogoWafel“我不理解对我的帖子进行向下投票”顺便说一句,我也认为这是一个有效的问题-可能是因为解决方案不难用谷歌搜索。“但是乘以10000,这是个问题。”为什么要加载10000个程序集?你想做什么?@ManfredRadlwimmer没有加载那么多程序集,搜索了那么多次。在我的项目中,我必须经常从字符串到类型进行这种解析。程序集的数量可能会增加。对于
Type.GetType(string typeName)
typeName
参数,我不理解从中对我的博文btwQuoting进行向下投票:要获取的类型的程序集限定名。请参阅AssemblyQualifiedName。如果类型在当前正在执行的程序集中或在Mscorlib`.dll中,则提供由其命名空间限定的类型名就足够了。@YogoWafel“我不理解对我的帖子进行向下投票”顺便说一句,我也不理解,我认为这是一个有效的问题-可能是因为谷歌不难找到解决方案。。在asker的例子中,恰巧
System.Drawing
既是
Color
的程序集又是命名空间,但情况可能并非总是如此。@JoeSewell True-最好先保存,然后再完全限定(无论它们是如何存储或处理的)。。在asker的例子中,恰巧
System.Drawing
既是
Color
的程序集又是命名空间,但情况可能并非总是如此。@JoeSewell True-最好先保存,然后完全限定(无论它们是如何存储或处理的)。