在学习了如何使用 Mono.Cecil 正确access the fields and properties of a List之后,有人指出您需要确保在List对象上维护类型参数的上下文'正在使用(这是有道理的)。
这样做的正确方法是什么?
编辑(根据@ Simon的要求)
如果列表中有TypeReference
,例如
System.Collections.Generic.List`1<MyNamespace.MyObject>
并且您想要访问它的字段,您实际上需要TypeDefinition
来获取此列表。当您尝试Resolve
TypeReference
时,您最终会丢失原始TypeReference
(即您的新TypeDefinition
现在将用于{}的类型参数p>
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...
)。