我想在给出名称的仅字符串时创建类型。这很明显:
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"
翻译成其类型等等......
答案 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}是查找的结果。由于反射很慢,这应该会显着提高您的表现。