gpt4 book ai didi

c# - ReflectionOnlyLoad 和 GetField

转载 作者:行者123 更新时间:2023-11-30 21:20:53 27 4
gpt4 key购买 nike

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

当我加载仅用于反射的程序集时,我尝试了 ReflectionOnlyLoad 而不是加载。第一个问题是 IsAssignableFrom 总是报告错误,但 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com