考虑以下测试代码结构:
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 的安全插件系统出现问题(可以在此处找到更多信息)。但是,当我添加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 不提供通用类型/字段定义;所以它必须明确地完成。另外,没有指定泛型参数的类型,所以还是个问题。