当前位置:首页 > 数码 > 摸索C中的隐秘方法调用-解锁外部或私有方法的秘密通道-深化探寻五种有目共睹的方法

摸索C中的隐秘方法调用-解锁外部或私有方法的秘密通道-深化探寻五种有目共睹的方法

admin7个月前 (04-18)数码26

在C#中,可以经常使用不同的方法调用外部或私有方法。上方区分引见经过反射、MethodInfo.CreateDelegate、表白式(树)、灵活方法(call)、灵活方法(calli)这五种方法。

1.经过反射方法

经常使用反射可以访问和调用外部或私有方法。

usingSystem;usingSystem.Reflection;publicclassMyClass{privatevoidMyPrivateMethod(){Console.WriteLine("调用了私有方法");}}classProgram{staticvoidMn(){MyClassmyObject=newMyClass();//经过反射失掉私有方法MethodInfomethodInfo=typeof(MyClass).GetMethod("MyPrivateMethod",BindingFlags.NonPublic|BindingFlags.Instance);//调用私有方法methodInfo.Invoke(myObject,null);}}

2.经常使用MethodInfo.CreateDelegate方法

经过MethodInfo.CreateDelegate方法可以创立委托,而后调用私有方法。

usingSystem;usingSystem.Reflection;publicclassMyClass{privatevoidMyPrivateMethod(){Console.WriteLine("调用了私有方法");}}classProgram{staticvoidMain(){MyClassmyObject=newMyClass();//经过反射失掉私有方法MethodInfomethodInfo=typeof(MyClass).GetMethod("MyPrivateMethod",BindingFlags.NonPublic|BindingFlags.Instance);//创立委托Actionaction=(Action)Delegate.CreateDelegate(typeof(Action),myObject,methodInfo);//调用私有方法action();}}

3.经常使用表白式(树)方法

经过表白式(树)可以创立灵活方法,而后调用私有方法。

usingSystem;usingSystem.Linq.Expressions;publicclassMyClass{privatevoidMyPrivateMethod(){Console.WriteLine("调用了私有方法");}}classProgram{staticvoidMain(){MyClassmyObject=newMyClass();//经常使用表白式创立灵活方法Actionaction=CreateDelegate<Action>(myObject,"MyPrivateMethod");//调用私有方法action();}//经常使用表白式创立灵活方法的通用方法staticTDelegateCreateDelegate<TDelegate>(objecttarget,stringmethodName){varmethodInfo=target.GetType().GetMethod(methodName,BindingFlags.NonPublic|BindingFlags.Instance);varparameter=Expression.Parameter(typeof(object),"instance");varcall=Expression.Call(Expression.Convert(parameter,target.GetType()),methodInfo);varlambda=Expression.Lambda<TDelegate>(call,parameter);returnlambda.Compile();}}

4.经常使用灵活方法(call)方法

经常使用灵活方法可以调用私有方法。

usingSystem;usingSystem.Reflection;usingSystem.Reflection.Emit;publicclassMyClass{privatevoidMyPrivateMethod(){Console.WriteLine("调用了私有方法");}}classProgram{staticvoidMain(){MyClassmyObject=newMyClass();//经常使用灵活方法调用私有方法CallPrivateMethod(myObject,"MyPrivateMethod");}//经常使用灵活方法调用私有方法的通用方法staticvoidCallPrivateMethod(objecttarget,stringmethodName){varmethodInfo=target.GetType().GetMethod(methodName,BindingFlags.NonPublic|BindingFlags.Instance);//经常使用灵活方法vardynamicMethod=newDynamicMethod("CallMethod",null,new[]{typeof(object)},target.GetType());varilGenerator=dynamicMethod.GetILGenerator();ilGenerator.Emit(OpCodes.Ldarg_0);//加载第一个参数,即指标实例ilGenerator.EmitCall(OpCodes.Call,methodInfo,null);//调用私有方法ilGenerator.Emit(OpCodes.Ret);//前往varaction=(Action<object>)dynamicMethod.CreateDelegate(typeof(Action<object>));//调用私有方法action(target);}}

5.经常使用灵活方法(calli)方法

C#

经常使用灵活方法(calli)可以调用私有方法。

usingSystem;usingSystem.Reflection.Emit;publicclassMyClass{privatevoidMyPrivateMethod(){Console.WriteLine("调用了私有方法");}}classProgram{staticvoidMain(){MyClassmyObject=newMyClass();//经常使用灵活方法(calli)调用私有方法CallPrivateMethod(myObject,"MyPrivateMethod");}//经常使用灵活方法(calli)调用私有方法的通用方法staticvoidCallPrivateMethod(objecttarget,stringmethodName){varmethodInfo=target.GetType().GetMethod(methodName,BindingFlags.NonPublic|BindingFlags.Instance);//经常使用灵活方法(calli)vardynamicMethod=newDynamicMethod("CallMethod",typeof(void),new[]{typeof(object)},target.GetType());varilGenerator=dynamicMethod.GetILGenerator();ilGenerator.Emit(OpCodes.Ldarg_0);//加载第一个参数,即指标实例ilGenerator.EmitCalli(OpCodes.Call,methodInfo.CallingConvention,methodInfo.ReturnType,methodInfo.GetParameters().Select(p=>p.ParameterType).ToArray(),null);//调用私有方法ilGenerator.Emit(OpCodes.Ret);//前往varaction=(Action<object>)dynamicMethod.CreateDelegate(typeof(Action<object>));//调用私有方法action(target);}}

以上五种方法都可以用于调用外部或私有方法,详细经常使用哪种方法取决于详细的场景和需求。


请大伙们帮个忙喔~~要5个句子(拟人,比喻,设问,排比等修辞手法),是六年级的哦~

比喻:2.阳光下盛开的百合花就是您的笑容。 3.皎洁的明月高挂在淡蓝色的天空中,月光像流水一样泻下来,大地一片银白色。 4.春风像个慈祥的母亲,拂着你的脸颊,使你感到舒畅,心旷神怡。 5.云彩像一朵朵洁白的羽毛,轻轻的飘浮在空中。 6.水仙花很漂亮,像一位站在小河边,穿着白衣服的仙女.拟人:白杨树像一位静默的少女,在月光下倾听着夏夜的故事。 天空好像生气了,他的愤怒使狂风暴雨不停的下着、刮着春天真是生机勃勃,它把正在争相斗艳的花朵染红了,也把大自然染绿了,更染绿了我们的心田苦难笑着对我说:“朋友 别倒下,站起来,你能行!”树叶儿那翩翩起舞的身姿在半空中摇曳回旋,绿色的脉络泛着梦幻般的光晕,娉婷婀娜;弧形的曲线带着一个轻巧的小把,俏皮可爱。 排比: 2.痛苦—— 痛苦是黑暗中的摸索,前进的路途中满是坎坷;痛苦是无人理解的悲哀,无助的面对一切挫折;痛苦是心灵最深的折磨,无泪且无法直言;痛苦是天生没有的表情,是烦恼中的恶魔。 3.愚蠢—— 愚蠢是一种天生的无奈,是一种后天的懒惰,是一颗自己种下的恶果,是一条好果实中的蛀虫。 4.谎言—— 谎言是一只心灵的蛀虫,将人的心蛀得面目全非;谎言是一个深深的泥潭,让人深陷其中无法自拔;谎言是一个无尽的黑洞,让人坠入罪恶的深渊万劫不复。 5.阴险—— 阴险,是一条披着羊皮的狼,干着不见天日的勾当;阴险是善良的公敌,嫉妒的朋友;阴险是一座心灵的冰山,让人透过清澈感到的是阵阵的寒意。 6.自私—— 自私是一面镜子,镜子里永远只看得到自己;自私是一块布匹,蒙住了自己的眼睛,看不见别人的痛楚;自私是一层玻璃,看上去透明,却始终隔开了彼此的距离。 夸张1、大虫见掀他不着,吼一声,就像半天里起了个霹雳,震得那山冈也动了。 ——《景阳冈》 2、柏油路晒化了,甚至铺户门前的铜牌好像也要晒化。 3、她还没有端酒怀,就醉了。 4、当破碎的心凝结了凝结,沉淀成沉淀,磨灭掉磨灭,才发现岁月早就划破我的脸,而时间他对我谄笑,那么耀眼,那么妖冶,忽而发现,自己离曾经的那天,那么遥远…… 5、班里静的,连针掉都能听见. 设问什么叫自律?自律就是自己管束自己的行为。 这人是谁?不是别人,原来是大明。 学好语文要背书吗?一定要! 这瓶饮料是谁买来的?原来是妈妈买来的。 是什么是合作?合作是互相配合 反问1、 字典难道不是我们的良师益友吗?2、难道那条街不热闹吗?3、 难道打仗就是为了多杀人吗? 4、毒刑拷打算得了什么?死亡也无法叫我开口。 5、实现四个现代化,难道不是全国人民的伟大历史任务吗?

怎样解决“此选项卡已经恢复 此网页上的问题导致Internet Explorer关闭并重新打开该选项卡。”

登录专利电子申请网,用【证书登录】时,偶尔会遇到这个问题:此网页出现问题,导致Internet Explorer关闭了该标签页。 导致无法登录系统,无法办理专利事务。 关于这个问题的解决方法,你可以参考《证书登录遇到网页出现问题,IE关闭该标签页这个问题的解决方案》。 它这里是专门为专利电子申请网登录而提供的解决方案,很管用。

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: C#

“摸索C中的隐秘方法调用-解锁外部或私有方法的秘密通道-深化探寻五种有目共睹的方法” 的相关文章

Task.Run-异步编程的比较-C-async-与 (task.run方法)

Task.Run-异步编程的比较-C-async-与 (task.run方法)

概述: C#中的异步编程有两重要形式:Task.Run用于在后盾线程口头同步操作,而async-awt更适用于明晰表白异步流程。基础用法展现了它们的便捷运行,初级用规律展示了它们的联合...

15-C-个顶级开源项目-中值得收藏的

15-C-个顶级开源项目-中值得收藏的

简介 MediatR 是 .NET 平台上一个轻量级库,它简化了命令查询责任分离 (CQRS) 模式的实现。CQRS 是一个设计模式,它将应用程序中的命令和查询分离成不同的组件。这可以提高应...

及其初级控件摸索之旅-深化了解跨平台开发畛域的弱小工具-C (及其初级控件有哪些)

及其初级控件摸索之旅-深化了解跨平台开发畛域的弱小工具-C (及其初级控件有哪些)

前几天一个学员在学习C#与初级控件交互时,也不知道初级控件可以用来做什么。 上方咱们就具体讲讲C#和初级控件交互的关系常识。 C#是一种配置丰盛的面向对象编程言语,它蕴含了许多初级控件...

C-线程本地存储-深化了解线程间值差别 (c++线程 window)

C-线程本地存储-深化了解线程间值差别 (c++线程 window)

为什么用ThreadStatic标志的字段,只要第一个线程拿到了初始值,其余线程都是自动值,让我能不能帮他解答一下,尼玛,我也不是神仙什么都懂,既然问了,那我试着帮他解答一下,也给前面相似不懂的好友解...

算法到-Python-客户端程序的综合指南-C-无缝集成 (算法到底应该怎么学?)

算法到-Python-客户端程序的综合指南-C-无缝集成 (算法到底应该怎么学?)

This example shows how to embed and execute an IronPython script in a C application. using IronP...

C#开发三个关键的内存区域-非托管堆内存和栈内存-托管堆内存 (c#开发实战)

C#开发三个关键的内存区域-非托管堆内存和栈内存-托管堆内存 (c#开发实战)

对内存的治理和操作大部分都是由运转时处置的。开发者无需过多关注内存治理的细节,由于托管堆内存的渣滓回收机制可以智能处置对象的调配和监禁。但是,在特定状况下,如与非托管代码交互、启动性能优化或处置少量数...

深入探索C中的LINQ魔法-功能概述和源代码剖析-b-b (进行深入探索)

深入探索C中的LINQ魔法-功能概述和源代码剖析-b-b (进行深入探索)

简介 LINQ(语言集成查询)是一种用于 C 中的数据查询和操作的强大工具。它允许开发人员使用类 C 语法而不是 SQL 语句来查询和操作各种数据源,例如集合、数组和 XML 文档。 20...

C-值传递与引用传递详解-中的参数传递 (c 值传递)

C-值传递与引用传递详解-中的参数传递 (c 值传递)

简介 C 是一种面向对象的编程语言,支持多种参数传递方式,包括传值和传引用两种方式。在本文中,我们将讨论 C 中的参数传递方式以及如何使用它们来实现不同的交互模式。 参数传递方式...