ReflectionOnlyLoad 和 GetField

Bur*_*ner 2 c#

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

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

Kev*_*olt 5

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

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

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

这似乎总是给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);
}
Run Code Online (Sandbox Code Playgroud)

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

相同的方法似乎适用于 IsSubclassOf 和 IsAssignableFrom。