加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 07:59:03 所属栏目:百科 来源:网络整理
导读:我正在尝试实现以下模式函数: MethodInfo GetMethod( ExpressionFuncTTarget,EventHandlerTEventArgs method) 如果需要,我可以提供TTarget的实例 所需的用法是: public static void Main(string[] args){ var methodInfo = GetMethodProgram,EventArgs(t =
我正在尝试实现以下模式函数:
MethodInfo GetMethod(      
  Expression<Func<TTarget,EventHandler<TEventArgs>>> method)

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

所需的用法是:

public static void Main(string[] args)
{
    var methodInfo = GetMethod<Program,EventArgs>(t => t.Method);
    Console.WriteLine("Hello,world!");
}

private void Method(object sender,EventArgs e)
{
}

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

private static MethodInfo GetMethod(TTarget target,Expression<Func<TTarget,EventHandler<TEventArgs>>> method)
{
  var lambda = method as LambdaExpression;
  var body = lambda.Body as UnaryExpression;
  var call = body.Operand as MethodCallExpression;
  var mInfo = call.Method as MethodInfo;

  Console.WriteLine(mInfo);

  throw new NotImplementedException();
}

打印出来:

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

解决方法

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读