为什么 Assembly.GetType() 在加载不同的程序集时反映反射程序集

本文关键字:程序集 反射 GetType Assembly 加载 为什么 | 更新日期: 2023-09-27 17:56:40

我是使用反射的新手,但试图理解GetType()的行为

我有以下几点:

assembly = Assembly.LoadFile(@"D:'ObjectRelations.dll");             
Type type = assembly.GetType("ObjectRelations.JSHierarchyBuilder");               
MethodInfo[] methods = type.GetMethods();
try                  
{       
 foreach (MethodInfo method in methods)
 {
     .... List Some info, etc.
 }
}
catch ...

虽然这会为程序集中包含的内容生成预期的输出,但使用

     Type type = assembly.GetType();

为我提供了与反射程序集关联的方法,而不是在 LoadFile 方法中指定的程序集,这不是我真正期望或认为会是一种实际行为;否则,如果返回类型是反射程序集的类型,为什么我需要指定要加载的任何文件。对我来说有点奇怪。

无论如何,如果这是正确的;并看到我的第一个示例按预期工作。那么,如何在不精确知道程序集的命名空间/和/或类名(可能与程序集的名称不同)的情况下获取任何信息,例如程序集的"方法"?

我假设反射应该允许您检查此类信息,即使您没有预先了解程序集的引擎盖下的内容,并且在运行时实例化对象的动态方面并不是"唯一"的好处。

有人可以解释一下吗?还是我做错了。

为什么 Assembly.GetType() 在加载不同的程序集时反映反射程序集

当您调用时:

 Type type = assembly.GetType();

您实际上是在程序集上调用 Object.GetType() 方法,该方法返回 typeof(Assembly) .

我怀疑你想要:

 Type[] types = assembly.GetTypes();

这将返回程序集中定义的所有类型的集合。

这里的区别在于,在第一种情况下,您要求变量(assembly)提供其类型,即Assembly。 在第二种情况下,您向实例询问在程序集本身中定义的类型列表。

您正在调用标准 Object.GetType() 方法,该方法为您提供调用它的实例的运行时类型。

您可能正在寻找Assembly.GetTypes()(复数)