我想得到一个System.Type
给定的类型名称string
.
例如,如果我有一个对象:
MyClass abc = new MyClass();
我可以说:
System.Type type = abc.GetType();
但如果我拥有的是:
string className = "MyClass";
nawfal.. 41
这取决于该类的组装.如果它在mscorlib
或调用汇编,你需要的只是
Type type = Type.GetType("namespace.class");
但如果它是从其他程序集中引用的,则需要执行以下操作:
Assembly assembly = typeof(SomeKnownTypeInAssembly).Assembly; Type type = assembly.GetType("namespace.class"); //or Type type = Type.GetType("namespace.class, assembly");
如果您只有类名"MyClass",那么您必须以某种方式获取命名空间名称(或者如果它是引用的程序集,则同时获取命名空间名称和程序集名称)并将其与类名一起连接.就像是:
//if class is in same assembly var namespace = typeof(SomeKnownTypeInNamespace).Namespace; Type type = Type.GetType(namespace + "." + "MyClass"); //or for cases of referenced classes var assembly = typeof(SomeKnownTypeInAssembly).Assembly; var namespace = typeof(SomeKnownTypeInNamespace).Namespace; Type type = assembly.GetType(namespace + "." + "MyClass"); //or Type type = Type.GetType(namespace + "." + "MyClass" + ", " + assembly.GetName().Name);
如果您完全没有(甚至没有意识到甚至程序集名称或命名空间名称)而只是类名,那么您可以查询整个程序集以选择匹配的字符串.但这应该慢得多:
Type type = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(x => x.GetTypes()) .FirstOrDefault(x => x.Name == "MyClass");
请注意,这将返回第一个匹配类,因此如果在程序集/命名空间中有多个具有相同名称的类,则无需非常准确.在任何情况下,缓存值都是有意义的.稍微快一点的方法是假设有一个默认命名空间:
Type type = AppDomain.CurrentDomain.GetAssemblies() .Select(a => new { a, a.GetTypes().First().Namespace }) .Select(x => x.a.GetType(x.Namespace + "." + "MyClass")) .FirstOrDefault(x => x != null);
但这又是一个假设,你的类型将与程序集中的其他随机类具有相同的名称空间; 太脆,不太好.
如果您需要其他域的类,您可以获取所有应用程序域的列表,请点击此链接.然后,您可以对每个域执行与上面所示相同的查询.如果其中类型驻留在您的组件没有加载,那么你必须使用手动加载它Assembly.Load
,Assembly.LoadFrom
等等.
这取决于该类的组装.如果它在mscorlib
或调用汇编,你需要的只是
Type type = Type.GetType("namespace.class");
但如果它是从其他程序集中引用的,则需要执行以下操作:
Assembly assembly = typeof(SomeKnownTypeInAssembly).Assembly; Type type = assembly.GetType("namespace.class"); //or Type type = Type.GetType("namespace.class, assembly");
如果您只有类名"MyClass",那么您必须以某种方式获取命名空间名称(或者如果它是引用的程序集,则同时获取命名空间名称和程序集名称)并将其与类名一起连接.就像是:
//if class is in same assembly var namespace = typeof(SomeKnownTypeInNamespace).Namespace; Type type = Type.GetType(namespace + "." + "MyClass"); //or for cases of referenced classes var assembly = typeof(SomeKnownTypeInAssembly).Assembly; var namespace = typeof(SomeKnownTypeInNamespace).Namespace; Type type = assembly.GetType(namespace + "." + "MyClass"); //or Type type = Type.GetType(namespace + "." + "MyClass" + ", " + assembly.GetName().Name);
如果您完全没有(甚至没有意识到甚至程序集名称或命名空间名称)而只是类名,那么您可以查询整个程序集以选择匹配的字符串.但这应该慢得多:
Type type = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(x => x.GetTypes()) .FirstOrDefault(x => x.Name == "MyClass");
请注意,这将返回第一个匹配类,因此如果在程序集/命名空间中有多个具有相同名称的类,则无需非常准确.在任何情况下,缓存值都是有意义的.稍微快一点的方法是假设有一个默认命名空间:
Type type = AppDomain.CurrentDomain.GetAssemblies() .Select(a => new { a, a.GetTypes().First().Namespace }) .Select(x => x.a.GetType(x.Namespace + "." + "MyClass")) .FirstOrDefault(x => x != null);
但这又是一个假设,你的类型将与程序集中的其他随机类具有相同的名称空间; 太脆,不太好.
如果您需要其他域的类,您可以获取所有应用程序域的列表,请点击此链接.然后,您可以对每个域执行与上面所示相同的查询.如果其中类型驻留在您的组件没有加载,那么你必须使用手动加载它Assembly.Load
,Assembly.LoadFrom
等等.
Type type = Type.GetType("foo.bar.MyClass, foo.bar");
MSDN.确保名称是Assembly Qualified.