How to get type from different namespace than System in c#?

不打扰是莪最后的温柔 提交于 2019-12-24 20:15:11

问题


I would like to create types when being given only strings of their names. Here it's obvious:

Type t = System.Type.GetType("System.Double");

But when I try to get type from another namespace, like System.Drawing, the above method won't return the correct type. Working solution I've found:

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

However, it looks pure and I guess doing it costs some time (AppDomain.CurrentDomain has 22 assemblies in my case, but multiplied by 10000, it's something). So can we get it faster? I'm not searching for a solution like type = typeof(System.Drawing.Color);, because possibly I'll have to translate "System.Text.StringBuilder" to its type and so on...


回答1:


If you want to make this work, you'll have to use the fully qualified type name (including the assembly). For System.Drawing.Color that would be (for .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");

to get the fully qualified name of an already loaded type, use

t.AssemblyQualifiedName



回答2:


While the accepted solution properly answers the question, I would also recommend caching any of these conversions into a <string, Type> dictionary, where the string is the input you are parsing, and the Type is the result of the lookup. This should significantly improve your performance since reflection is slow.



来源:https://stackoverflow.com/questions/48977883/how-to-get-type-from-different-namespace-than-system-in-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!