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

时间:2018-02-25 20:03:34

标签: c# reflection types namespaces

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

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"翻译成其类型等等......

2 个答案:

答案 0 :(得分:2)

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

System.Drawing.Color, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Type t = Type.GetType("System.Drawing.Color, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");

要获取已加载类型的完全限定名称,请使用

t.AssemblyQualifiedName

答案 1 :(得分:2)

虽然接受的解决方案正确回答了问题,但我还建议将这些转换缓存到<string, Type>字典中,string是您要解析的输入,{{1}是查找的结果。由于反射很慢,这应该会显着提高您的表现。