如何从表达式<操作>获取接口成员名称

本文关键字:获取 取接口 成员 表达式 操作 | 更新日期: 2023-09-27 18:31:52

我正在寻找一种方法来获取传递到Client.SendMessage表达式的接口成员名称。以下是我尝试的,但我收到无效的转换异常。

public interface IFoo
{
    void Operation1(object data);
    void Operation2(object data);
}
public class FooClient<T>
{
    public void SendMessage(Expression<Action<T>> expr)
    {
        // InvalidCastException:
        // Cannot cast 'InstanceMethodCallExpressionN' to 'MemberExpression'
        var iMemberName = ((MemberExpression)expr.Body).Member.Name;
        Console.WriteLine(iMemberName);
    }
}
class Program
{
    static void Main()
    {
        var client = new FooClient<IFoo>();
        // Should write 'Operation1'
        client.SendMessage(x => x.Operation1("Hello, world!"));
        // Should write 'Operation2'
        client.SendMessage(x => x.Operation2("How are you?"));
    }
}

如何从表达式<操作<T>>获取接口成员名称

由于内部表达式是MethodCallExpression(而不是表示属性或字段访问表达式的MemberExpression),因此应适当地强制转换它并获取Method属性返回的 MethodInfo 对象的名称。

public class FooClient<T>
{
    public void SendMessage(Expression<Action<T>> expr)
    {
        var iMemberName = ((MethodCallExpression)expr.Body).Method.Name;
        Console.WriteLine(iMemberName);
    }
}