Methodenname aus der Ausdrucksbaumstruktur extrahieren?

.net c# expression-trees linq reflection

Frage

Ich versuche, die folgende Musterfunktion zu implementieren:

MethodInfo GetMethod(      
  Expression<Func<TTarget, EventHandler<TEventArgs>>> method)

Ich kann bei Bedarf eine Instanz von TTarget bereitstellen

Die gewünschte Verwendung ist:

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)
{
}

Folgendes habe ich bisher versucht:

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();
}

Es druckt aus:

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

Akzeptierte Antwort

Du bist halb da. Sehen Sie sich den folgenden Code an

public static void Main(string[] args)
{
    var program = new Program();
    var methodInfo = GetMethod<Program, EventArgs>(()=> program.Method);
    Console.WriteLine(methodInfo.Name);
}

Und verwenden Sie den folgenden Code, um den Methodennamen zu erhalten.

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;
}

Ich hoffe, das beantwortet deine Frage.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum