我正在尝试实现以下模式函数:
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; }
我希望这回答了你的问题.