3

に渡された式のインターフェイス メンバー名を取得する方法を探しています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?"));
    }
}
4

1 に答える 1

4

内部式はMethodCallExpression(MemberExpressionプロパティまたはフィールド アクセス式を表す ではなく) であるため、適切にキャストし、Methodpropertyによって返される MethodInfo オブジェクトの名前を取得する必要があります。

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

        Console.WriteLine(iMemberName);
    }
}
于 2013-09-17T19:03:47.540 に答える