如果我通过Assembly.Load加载程序集,则可以遍历其类型,请通过typef(...)。IsAssignableFrom查找特定类型,并通过GetField从类型获取字段信息。

当我加载程序集以进行反射时,仅尝试了ReflectionOnlyLoad而不是加载。第一个问题是IsAssignableFrom始终报告为false,但是GetInterface可以完成这项工作。我没有找到解决方案的第二个问题是GetField总是返回null。

最佳答案

我遇到了与IsAssignableFrom相同的问题,总是返回false,但是做了一些试验并找到了解决方法。关键是要确保比较中的两种类型都在ReflectionlyOnly上下文中。

换句话说,这通常不起作用:

var types = Assembly.ReflectionOnlyLoad(assemblyName).GetExportedTypes();
foreach( var t in types )
{
    bool check = SomeBaseType.IsAssignableFrom(t);
}


这似乎总是给check=false,但是我认为这是因为t在仅反射的上下文中,而SomeBaseType不在。

我发现的解决方法是在仅反射的上下文中加载基类的程序集,然后在该上下文中找到等效的基类型。然后,我们可以在两种类型都仅反射的情况下进行比较:

var baseAssembly = Assembly.ReflectionOnlyLoad(typeof(SomeBaseType).Assembly.FullName);
var baseTypes = baseAssembly.GetExportedTypes();
var reflectionOnlyBaseType = Array.Find(baseTypes,(t)=>(t.FullName==typeof(SomeBaseType).FullName));
var types = Assembly.ReflectionOnlyLoad(assemblyName).GetExportedTypes();
foreach( var t in types )
{
    bool check = reflectionOnlyBaseType.IsAssignableFrom(t);
}


这似乎给出了预期的结果。在不重新加载程序集的情况下,可能有一种更有效的方法来访问仅反射的上下文(我不是C#专家),但这是我能找到的最简单的方法。

IsSubclassOf和IsAssignableFrom似乎都可以使用相同的方法。

关于c# - ReflectionOnlyLoad和GetField,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3008097/

10-11 23:54