我们可以修改此代码以返回方法的名称而不是属性吗?

Dej*_*jas 2 c#

寻找一种干净的方法来以类型安全的方式发现方法的字符串名称.

这是我对属性的看法,但是我无法弄清楚如何为方法做到这一点.

class Program
{
    class Customer
    {
        public String Id { get; set; }
    }

    public static String GetPropertyName<T>(
        Expression<Func<T, Object>> selector) where T : class
    {
        var expression = (MemberExpression)selector.Body;
        return expression.Member.Name;
    }

    static void Main(string[] args)
    {
        String propertyName = GetPropertyName<Customer>(c => c.Id);
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

几乎改为:

    var expression = (MethodCallExpression)selector.Body;
    return expression.Method.Name;
Run Code Online (Sandbox Code Playgroud)

除了明显的例外,您将需要一个Action<T>处理void方法的选项.当然,你必须提供虚拟参数值 - 如果你真的想要你也可以获得它们.

实际上,您现有的代码可能不健全; 你可能需要抛弃一个强制转换操作(将int装入一个对象).

public static string GetMethodName<T>(Expression<Func<T, Object>> selector) where T : class
{
    var expression = (MethodCallExpression)(selector.Body is UnaryExpression ? ((UnaryExpression)selector.Body).Operand : selector.Body);
    return expression.Method.Name;
}
public static string GetMethodName<T>(Expression<Action<T>> selector) where T : class
{
    var expression = (MethodCallExpression)(selector.Body is UnaryExpression ? ((UnaryExpression)selector.Body).Operand : selector.Body);
    return expression.Method.Name;
}
Run Code Online (Sandbox Code Playgroud)