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

从方法引用中获取methodinfoC#分享

时间:2023-04-11 01:07:37 C#

从C#方法引用中获取methodinfo当我们想要获取指定类型的Type实例时,可以使用C#的typeof关键字。但是,如果我想通过引用获取方法的MethodInfo,我可以使用什么?例如,我有一个简单的控制台应用程序。它包含Program.Main方法。我想通过使用诸如methodinfoof(Program.Main)之类的方法来获取MethodInfo。我遇到这个问题是因为方法名称可能会更改,所以我不能只使用Type.GetMethodInfo(stringMethodName)。我有大约10000个方法,我想获取MethodInfo,因此向我的方法添加任何自定义属性或任何内容都不是解决方案。稍微调整以前发布的答案,但这篇博文似乎做你想做的;http://blog.functionalfun.net/2009/10/getting-methodinfo-of-generic-method.html示例用法如下;varmethodInfo=SymbolExtensions.GetMethodInfo(()=>Program.Main());这个问题的原始答案;https://stackoverflow.com/a/9132588/5827您可以将表达式树用于非静态方法。这是一个例子。使用System.Linq.Expressions;使用System.Reflection;publicstaticclassMethodInfoHelper{publicstaticMethodInfoGetMethodInfo(Expression>expression){varmember=expression.BodyasMethodCallExpression;if(member!=null)返回member.Method;thrownewArgumentException("表达式不是方法","表达式");你会像这样使用它:MethodInfomi=MethodInfoHelper.GetMethodInfo(x=>x.Test());Console.WriteLine(mi.Name);Test()是在Program类中声明的成员函数。如果要支持属性getter和setter,请使用MemberExpression和MemberInfo。考试类publicclassFoo{publicvoidDoFoo(){Trace.WriteLine("DoFoo");}publicstaticvoidDoStaticFoo(){Trace.WriteLine("DoStaticFoo");你可以做这样的事情MethodInfoGetMethodInfo(Actiona){returna.Method;}varfoo=newFoo();MethodInfomi=GetMethodInfo(foo.DoFoo);MethodInfomiStatic=GetMethodInfo(Foo.DoStaticFoo);//dowhateveryouneedwithmethodinfoupdateeach@Greg评论说,如果你有方法的一些参数,你可以使用Action,Action,Action或Func,不便的是你仍然需要为GetMethodInfo写一个重载。我知道这是一篇非常古老的帖子,但我会把它扔在这里,供可能仍在寻找简单解决方案的任何人使用。这是没有人想到的最简单的解决方案:typeof(Program).GetMethods();返回一个包含Program类中所有方法的MethodInfo的数组,无论属性或它们是否具有参数。例如,您可以根据需要对其进行迭代以列出所有10.000多个方法名称。你也可以做typeof(Program).GetMethod(nameof(Program.Main));这样,如果方法的名称发生变化,VisualStudio的重构也会在此处重命名它。注意:5年前发布问题时,“nameof”关键字不可用。我创建了一个T4模板,它创建了帮助您执行此操作所需的辅助函数。它创建一个函数列表,用于从Func或Action方法获取MethodInfo对象。将以下代码复制到名为GetMethodInfo.tt的文件中:使用System.Linq.Expressions;使用System.Reflection;命名空间工具{publicstaticclassGetMethodInfo{publicstaticMethodInfoForFunc>(Expression>>expression){varmember=expression.BodyasMethodCallExpression;if(member!=null)返回member.Method;thrownewArgumentException("表达式不是方法","表达式");}publicstaticMethodInfoForAction>(Expression>>expression){varmember=expression.BodyasMethodCallExpression;if(member!=null)返回member.Method;thrownewArgumentException("表达式不是方法","表达式");}}}备注:可能不理想,但有帮助:以上是C#学习教程:从方法参考C#中获取methodinfo分享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——varcallback=typeof(BlogController).GetMethod(nameof(BlogController.GetBlogs));本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢