Mar*_*k T 37 .net c# reflection types
我想得到一个System.Type
给定的类型名称string
.
例如,如果我有一个对象:
MyClass abc = new MyClass();
Run Code Online (Sandbox Code Playgroud)
我可以说:
System.Type type = abc.GetType();
Run Code Online (Sandbox Code Playgroud)
但如果我拥有的是:
string className = "MyClass";
Run Code Online (Sandbox Code Playgroud)
naw*_*fal 41
这取决于该类的组装.如果它在mscorlib
或调用汇编,你需要的只是
Type type = Type.GetType("namespace.class");
Run Code Online (Sandbox Code Playgroud)
但如果它是从其他程序集中引用的,则需要执行以下操作:
Assembly assembly = typeof(SomeKnownTypeInAssembly).Assembly;
Type type = assembly.GetType("namespace.class");
//or
Type type = Type.GetType("namespace.class, assembly");
Run Code Online (Sandbox Code Playgroud)
如果您只有类名"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);
Run Code Online (Sandbox Code Playgroud)
如果您完全没有(甚至没有意识到甚至程序集名称或命名空间名称)而只是类名,那么您可以查询整个程序集以选择匹配的字符串.但这应该慢得多:
Type type = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(x => x.GetTypes())
.FirstOrDefault(x => x.Name == "MyClass");
Run Code Online (Sandbox Code Playgroud)
请注意,这将返回第一个匹配类,因此如果在程序集/命名空间中有多个具有相同名称的类,则无需非常准确.在任何情况下,缓存值都是有意义的.稍微快一点的方法是假设有一个默认命名空间:
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);
Run Code Online (Sandbox Code Playgroud)
但这又是一个假设,你的类型将与程序集中的其他随机类具有相同的名称空间; 太脆,不太好.
如果您需要其他域的类,您可以获取所有应用程序域的列表,请点击此链接.然后,您可以对每个域执行与上面所示相同的查询.如果其中类型驻留在您的组件没有加载,那么你必须使用手动加载它Assembly.Load
,Assembly.LoadFrom
等等.
Chr*_*org 33
Type type = Type.GetType("foo.bar.MyClass, foo.bar");
Run Code Online (Sandbox Code Playgroud)
MSDN.确保名称是Assembly Qualified.
归档时间: |
|
查看次数: |
32195 次 |
最近记录: |