c# – 从表达式树中提取方法名称?

前端之家收集整理的这篇文章主要介绍了c# – 从表达式树中提取方法名称?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试实现以下模式函数
  1. MethodInfo GetMethod(
  2. Expression<Func<TTarget,EventHandler<TEventArgs>>> method)

如果需要,我可以提供TTarget的实例

所需的用法是:

  1. public static void Main(string[] args)
  2. {
  3. var methodInfo = GetMethod<Program,EventArgs>(t => t.Method);
  4. Console.WriteLine("Hello,world!");
  5. }
  6.  
  7. private void Method(object sender,EventArgs e)
  8. {
  9. }

这是我到目前为止所尝试的内容

  1. private static MethodInfo GetMethod(TTarget target,Expression<Func<TTarget,EventHandler<TEventArgs>>> method)
  2. {
  3. var lambda = method as LambdaExpression;
  4. var body = lambda.Body as UnaryExpression;
  5. var call = body.Operand as MethodCallExpression;
  6. var mInfo = call.Method as MethodInfo;
  7.  
  8. Console.WriteLine(mInfo);
  9.  
  10. throw new NotImplementedException();
  11. }

打印出来:

System.Delegate CreateDelegate(System.Type,System.Object,System.Reflection.Met
hodInfo)

解决方法

你在那里的一半.
看下面的代码
  1. public static void Main(string[] args)
  2. {
  3. var program = new Program();
  4. var methodInfo = GetMethod<Program,EventArgs>(()=> program.Method);
  5. Console.WriteLine(methodInfo.Name);
  6. }

并使用以下代码获取方法名称.

  1. static MethodInfo GetMethod<TTarget,TEventArgs>(Expression<Func<EventHandler<TEventArgs>>> method) where TEventArgs:EventArgs
  2. {
  3. var convert = method.Body as UnaryExpression;
  4. var methodCall = (convert.Operand as MethodCallExpression);
  5. if (methodCall != null && methodCall.Arguments.Count>2 && methodCall.Arguments[2] is ConstantExpression)
  6. {
  7. var methodInfo = (methodCall.Arguments[2]as ConstantExpression).Value as MethodInfo;
  8. return methodInfo;
  9. }
  10. return null;
  11. }

我希望这回答了你的问题.

猜你在找的C#相关文章