c# – 如何将值存储到泛型类字段(Mono.Cecil)

我正在使用Mono.Cecil来重写一些程序集.给定一个带有字符串字段的泛型类.我想在这个类的方法生成代码,该类写入该字段.
这是实现这一目标的代码
var origInstanceField = type.Fields.First(fld => fld.Name.Equals("_original"));
InsertBeforeReturn(instanceMethod.Body,new[]
{
   Instruction.Create(OpCodes.Ldarg_0),Instruction.Create(OpCodes.Ldstr,"genCodetoOriginal"),Instruction.Create(OpCodes.Stfld,origInstanceField)
});

对于非泛型类,它就像一个魅力.对于泛型类,它会产生错误的IL.如果您查看反编译的IL,您可以发现与编译器发出的相同指令相比的差异.

.method public hidebysig instance void FillFields() cil managed
{
.maxstack 8
L_0000: nop 
L_0001: ldarg.0 
L_0002: ldstr "non-gen code to non-gen field"
L_0007: stfld string TestConsole.Genericclass`1<!T>::_original
L_0017: ldarg.0 
L_0018: ldstr "genCodetoOriginal"
L_001d: stfld string TestConsole.Genericclass`1::_original
L_0022: ret 
}

字段引用指向开放泛型类型[Genericclass<>],而不指向要构造的类型[Genericclass< T&GT].
我也尝试使用具有相同结果的静态字段.
任何想法我怎样才能找到正确的FieldDeFinition?

解决方法

我通过查看Anotar( https://github.com/Fody/Anotar)的源代码找到了解决方案.诀窍是使用类型定义创建一个字段引用,引用实例化的泛型,而不是原始的泛型.
var declaringType = new GenericInstanceType(deFinition.DeclaringType);
foreach (var parameter in deFinition.DeclaringType.GenericParameters)
{
     declaringType.GenericArguments.Add(parameter);
}
return new FieldReference(deFinition.Name,deFinition.FieldType,declaringType);

在来自类型的FieldDeFinition上使用此转换可以提供正确的FieldReference.将泛型参数提供给泛型参数有点奇怪但有意义.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...