使用Fody发布访问通用基类中的字段

时间:2017-08-02 14:29:29

标签: 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

这会导致Dynamics CRM的安全插件系统出现问题(可以找到更多信息here)。但是,当我将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似乎不提供泛型类型/字段定义;所以必须明确地完成。此外,未指定通用参数的类型,因此它仍然是一个问题。

1 个答案:

答案 0 :(得分:0)

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

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>)。