我正在寻找一种方法来获取传递给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?"));
}
}
答案 0 :(得分:4)
由于内部表达式是MethodCallExpression
(而不是表示属性或字段访问表达式的MemberExpression
),因此应该适当地转换它并获取{返回的MethodInfo对象的名称{3}}
public class FooClient<T>
{
public void SendMessage(Expression<Action<T>> expr)
{
var iMemberName = ((MethodCallExpression)expr.Body).Method.Name;
Console.WriteLine(iMemberName);
}
}