使用 Fody 访问泛型基类中的字段时出现问题



考虑以下测试代码结构:

class TestClass<T>
{
public object TestObject;
}
class TestClass2<T> :TestClass<T>
{
public int TestMethod()
{}
}

当我将Instruction.Create(OpCodes.Ldfld, TestObjectField)添加到TestMethod时,我得到以下结果:

ldfld class Object TestNamespace.TestClass'1::TestObject

这会导致动态CRM的安全插件系统出现问题(更多信息可以在这里找到(。但是,当我将TestObject = new object()添加到TestMethod时,我得到以下结果,运行良好:

ldfld class Object class TestNamespace.TestClass'1<!T>::TestObject

仅当我尝试访问的对象位于泛型基类中时,才会发生这种情况。有没有办法让我从 Fody 内部模拟所需的结果?

更新:

我设法使用以下行部分解决了该问题:

var testObjectFieldRef = testObjectFieldDefinition?.Resolve().GetGeneric();
var testClassTypeRef = testObjectFieldRef?.DeclaringType.Resolve().GetGeneric();
if (testClassTypeRef != null)
{
testObjectFieldRef.DeclaringType = testClassTypeRef;
}

似乎默认情况下,ModuleDefinition 不提供泛型类型/字段定义;因此必须显式完成。此外,未指定泛型参数的类型,因此这仍然是一个问题。

我设法使用以下代码(参考(解决了这个问题:

var genericBaseType = (GenericInstanceType) testClassTypeRef.BaseType;
var genericArgs = genericBaseType .GenericArguments;
var fullBaseTypedName = genericBaseType.ElementType.MakeGenericInstanceType(genericArgs.ToArray()).FullName

根据需要返回ldfld class Object class TestNamespace.TestClass'1<!T>::TestObject。它还将填充类型参数的类型(代替<!T>如果在派生类中给出(。

最新更新