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

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

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

class Program { class Customer { public String Id { get; set; } } public static String GetPropertyName( Expression<Func> selector) where T : class { var expression = (MemberExpression)selector.Body; return expression.Member.Name; } static void Main(string[] args) { String propertyName = GetPropertyName(c => c.Id); } } 

几乎改为:

  var expression = (MethodCallExpression)selector.Body; return expression.Method.Name; 

除了你需要一个Action选项来处理void方法之外。 当然,你必须提供虚拟参数值 – 如果你真的想要你也可以获得它们。

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

 public static string GetMethodName(Expression> 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(Expression> selector) where T : class { var expression = (MethodCallExpression)(selector.Body is UnaryExpression ? ((UnaryExpression)selector.Body).Operand : selector.Body); return expression.Method.Name; } 

如果有帮助,我们的代码库使用以下内容:

 public class TypeHelper { private static PropertyInfo GetPropertyInternal(LambdaExpression p) { MemberExpression memberExpression; if (p.Body is UnaryExpression) { UnaryExpression ue = (UnaryExpression)p.Body; memberExpression = (MemberExpression)ue.Operand; } else { memberExpression = (MemberExpression)p.Body; } return (PropertyInfo)(memberExpression).Member; } public static string GetPropertyName(Expression> p) { return GetPropertyNameInternal(p); } public static string GetPropertyName(Expression> p) { return GetPropertyNameInternal(p); } public static string GetPropertyName(Expression> p) { return GetPropertyNameInternal(p); } public static string GetPropertyName(Expression p) { return GetPropertyNameInternal((LambdaExpression) p); } private static string GetPropertyNameInternal(LambdaExpression p) { return GetPropertyInternal(p).Name; } public static PropertyInfo GetProperty(Expression> p) { return GetPropertyInternal(p); } public static PropertyInfo GetProperty(Expression> p) { return GetPropertyInternal(p); } public static PropertyInfo GetProperty(Expression> p) { return GetPropertyInternal(p); } } 

这使您有能力:

 var propertyName = TypeHelper.GetPropertyName(c => c.Id); 

要么

 var propertyName = TypeHelper.GetPropertyName(() => this.Id); // If inside Customer class 

如果碰巧有System.Web.Mvc ,可以使用ExpressionHelper.GetExpressionText(expression) ,如下所示:

 Expression> expression = r => r.Message; Assert.AreEqual("Message", ExpressionHelper.GetExpressionText(expression)); 

Response是具有Message属性的自定义类。)