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

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

概述我正在使用Mono.Cecil来重写一些程序集.给定一个带有字符串字段的泛型类.我想在这个类的方法中生成代码,该类写入该字段. 这是实现这一目标的代码: var origInstanceField = type.Fields.First(fld => fld.Name.Equals("_original"));InsertBeforeReturn(instanceMethod.Body, new 我正在使用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 8L_0000: nop L_0001: ldarg.0 L_0002: ldstr "non-gen code to non-gen fIEld"L_0007: stfld string TestConsole.Genericclass`1<!T>::_originalL_0017: ldarg.0 L_0018: ldstr "genCodetoOriginal"L_001d: stfld string TestConsole.Genericclass`1::_originalL_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.将泛型参数提供给泛型参数有点奇怪但有意义.

总结

以上是内存溢出为你收集整理的c# – 如何将值存储到泛型类字段(Mono.Cecil)全部内容,希望文章能够帮你解决c# – 如何将值存储到泛型类字段(Mono.Cecil)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1252124.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存