当前位置:  开发笔记 > 编程语言 > 正文

从类型的部分名称获取System.Type

如何解决《从类型的部分名称获取System.Type》经验,为你挑选了2个好方法。

我想得到一个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等等.



1> nawfal..:

这取决于该类的组装.如果它在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等等.



2> Chris Marast..:
Type type = Type.GetType("foo.bar.MyClass, foo.bar");

MSDN.确保名称是Assembly Qualified.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有