在学习了如何使用Mono.Cecil正确访问 List 的字段和属性之后,有人指出您需要确保在您正在使用的 List 对象上维护类型参数的上下文(这使得感觉)。
这样做的正确方法是什么?
编辑(根据@Simon 的要求)
例如,鉴于您有TypeReference
一个列表
System.Collections.Generic.List`1<MyNamespace.MyObject>
如果你想访问它的字段,你实际上需要一个TypeDefinition
这个列表。当您尝试使用Resolve
您的TypeReference
时,您最终会丢失原来的类型参数TypeReference
(也就是您的新参数TypeDefinition
现在将用于
System.Collections.Generic.List`1
这将有一个GenericParameter
)T
。
我试图通过如下代码重新应用类型参数
var resolve = myList.Resolve();
resolve.GenericParameters.Clear();
foreach (var p in (myList as GenericInstanceType).GenericArguments)
{
var gp = new GenericParameter(p.FullName, p.GetElementType().Resolve());
resolve.GenericParameters.Add(gp);
}
这不起作用,导致
Member 'MyNamespace.MyObject' is declared in another module and needs to be
imported
错误。(如果您没有尝试以这种方式重新填充,则错误将是Member 'T' is declared...
)。