Sto cercando di implementare la seguente funzione di modello:
MethodInfo GetMethod(
Expression<Func<TTarget, EventHandler<TEventArgs>>> method)
Posso fornire un'istanza di TTarget se necessario
L'utilizzo desiderato è:
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)
{
}
Ecco cosa ho provato finora:
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();
}
Stampa:
System.Delegate CreateDelegate(System.Type, System.Object, System.Reflection.Met hodInfo)
Sei a metà strada. Guarda il codice qui sotto
public static void Main(string[] args)
{
var program = new Program();
var methodInfo = GetMethod<Program, EventArgs>(()=> program.Method);
Console.WriteLine(methodInfo.Name);
}
E usa il seguente codice per ottenere il nome del metodo.
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;
}
Spero che questo risponda alla tua domanda.