当前位置: 首页 > 编程语言 > C#

创建一个DynamicMethod给属性赋值?分享

时间:2023-04-11 11:46:40 C#

创建一个DynamicMethod给属性赋值?这是一个学习练习。我创建了一个采用Foo和String并设置A属性的方法。我使用Reflector反汇编生成了以下发射代码。反汇编看起来像这样:.methodprivatehidebysigstaticvoidSpork(classConsoleTesting.Foof,string'value')cilmanaged{.maxstack8L_0000:ldarg.0L_0001:ldarg.1L_0002:callvirtinstancevoidConsoleTesting.Foo::set_A(string)L_0007:ret}好的,所以我模拟了我的排放代码:usingSystem;使用System.Collections.Generic;使用System.Linq;使用系统文本;使用System.Reflection;使用System.Reflection.Emit;命名空间ConsoleTesting{classFoo{publicstringA{get;放;}}classProgram{staticActionGenMethodAssignment(stringpropName){MethodInfosetMethod=typeof(Foo).GetMethod("get_"+propName);if(setMethod==null)thrownewInvalidOperationException("nopropertysetteravailable");Type[]argTypes=newType[]{typeof(Foo),typeof(String)};DynamicMethod方法=newDynamicMethod("__dynamicMethod_Set_"+propName,null,argTypes,typeof(Program));ILGeneratorIL=method.GetILGenerator();IL.Emit(OpCodes.Ldarg_0);IL.Emit(OpCodes.Ldarg_1);IL.Emit(OpCodes.Callvirt,setMethod);IL.Emit(OpCodes.Ret);method.DefineParameter(1,ParameterAttributes.In,"实例");method.DefineParameter(2,ParameterAttributes.In,"value");Actionretval=(Action)method.CreateDelegate(typeof(Action));返回retval;}staticvoidMain(string[]args){Foof=newFoo();varmeth=GenMethodAssignment("A");冰毒(f,“杰森”);控制台.ReadLine();我得到这个异常:JIT编译器遇到内部限制。krunk是什么意思,我该如何解决?编辑:我认为可能是因为目标方法是私有的,但我不太确定来自DynamicMethodMSDN页面:以下代码示例创建了一个与类型逻辑关联的DynamicMethod。该关联使其可以访问该类型的私有成员。有趣的问题。首先,您无能为力。如果您只需要setter的委托,则可以使用Delegate.CreateDelegate。Delegate.CreateDelegate(typeof(Action),typeof(Foo).GetProperty("A").GetSetMethod())作为动作;如果您使用的是.NET3.5+,则可以使用表达式树,我强烈建议您通过DynamicMethod学习它们,它们在.NET3.5中的使用有限,在.NET4中几乎没有。(TypeBuilder仍然非常有用)。vartargetExpression=Expression.Parameter(typeof(Foo),"target");varvalueExpression=Expression.Parameter(typeof(string),"value");varexpression=Expression.Lambda>(Expression.Call(targetExpression,typeof(Foo).GetProperty("A").GetSetMethod(),valueExpression),targetExpression,valueExpression);在.NET4中,您可以使用Expression.Assign编写稍微漂亮一点的代码,但也好不了多少。最后,如果您真的想在IL中执行此操作,这是可行的。DynamicMethod方法=newDynamicMethod("Setter",typeof(void),new[]{typeof(Foo),typeof(string)},true);varilgen=方法。获取ILGenerator();伊尔根。发出(操作码。Ldarg_0);ilgen.Emit(OpCodes.Ldarg_1);ilgen.Emit(OpCodes.Callvirt,typeof(Foo).GetProperty("A").GetSetMethod());ilgen.Emit(OpCodes.Ret);varaction=method.CreateDelegate(typeof(Action))asAction;我认为您的问题是您当前正在调用set方法,这实际上是此行中的错误getMethod::MethodInfosetMethod=typeof(Foo).GetMethod("get_"+propName);I从未分配参数属性,但这也可能是一个问题。好的,我明白了。改变IL.Emit(OpCodes.Callvirt,setMethod);到IL.Emit(OpCodes.Call,setMethod);修复。我不知道为什么反汇编显示CallVirt,但是呃。我需要运行什么版本的.NET?从表达式树编译委托会容易得多。以上就是C#学习教程:CreateaDynamicMethodtoassignavaluetoanattribute?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢