如何在运行时替换方法实现?我想要属性getter和方法,我可以用我自己的自定义属性来装饰,并且根据该属性的存在,用不同的实现替换方法主体。此外,不同的实现需要知道给它装饰方法的自定义属性的构造函数参数。这显然可以使用AOP来完成,例如PostSharp或LinFu,但我想知道是否有一种方法可以做到这一点而不涉及构建后处理步骤,因为添加会使项目进一步复杂化。使用传统的.NetAPI无法实现这一点。方法体在编译时是固定的,不能更改。我说的是传统方法,但因为使用分析仪和ENCAPI,从技术上讲可以更改方法主体。但这些API在受限情况下运行,不被视为通用API。任何好的AOP框架都可以在运行时运行。我目前正在研究具有这种能力的人之一。您可以在这里找到它:NConcer.NETRuntimeAspectOrientedProgramming一个向您展示其工作原理的小示例...假定自定义属性:[AttributeUsage(AttributeTargets.Method,AllowMultiple=false,Inherited=true)]publicclassMyAttribute1:Attribute{公共字符串MyAttributeValue;}标记类示例:publicclassCalculator{[MyAttribute1(MyAttributeValue="HelloWorld")]publicintAdd(inta,intb){returna+b;}}publicclassMyAspect:IAspect{//这段代码将被执行以创建一个装饰器,而不是在名义上的执行流程中(你不必在这里强调性能)publicIEnumerableAdvise(MethodInfomethod){varmyattribute1=method.GetCustomAttributes(typeof(MyAttribute1),true).Cast().SingleOrDefault();//如果未定义属性,则不返回“建议”if(myattribute1==null){yieldbreak;}//获取你的属性属性。varmyattributevalue=myattribute1.MyAttributeValue;//定义你的替代方法varsignature=newType[]{method.DeclaringType}.Concat(method.GetParameters().Select(parameter=>parameter.Type)).ToArray();vardynamicMethod=newDynamicMethod(string.Empty,method.ReturnType,signature,method.DeclaringType,true);varbody=dynamicMethod.GetILGenerator();//TODO:发出你的代码!也许使用你的属性字段值来知道你想做什么样的替换......body.Emit(OpCodes.Ret);//定义替换yieldreturnnewAdvice(dynamicMethod);}}用例:staticpublicvoidmain(string[]args){Aspect.Weave(method=>method.IsDefined(typeof(MyAttribute1),true));有一些方法允许您在运行时动态更改任何方法框架:根据您的特定需求,自.NET1.0以来有一些可能性可以拦截使用System.Runtime.Remoting.Proxies命名空间中的类型的调用。以上就是C#学习教程:如何在运行时替换方法实现?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
