我们可以修改此代码以返回方法的名称而不是属性吗?
寻找一种干净的方法来以类型安全的方式发现方法的字符串名称。
这是我对属性的看法,但是我无法弄清楚如何为方法做到这一点。
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属性的自定义类。)