我可以从Func 获取特定的元数据吗?

请考虑以下代码:

string propertyName; var dateList = new List() { DateTime.Now }; propertyName = dateList.GetPropertyName(dateTimeObject => dateTimeObject.Hour); // I want the propertyName variable to now contain the string "Hour" 

这是扩展方法:

 public static string GetPropertyName(this IList list, Func func) { //TODO: would like to dynamically determine which // property is being used in the func function/lambda } 

有没有办法做到这一点? 我想也许这个其他方法,使用Expression<Func>而不是Func会给我更多的力量来找到我需要的东西,但是我不知道如何。

 public static string GetPropertyName(this IList list, Expression<Func> expr) { // interrogate expr to get what I want, if possible } 

这是我第一次与Linq做过这么深的事情,所以也许我错过了一些明显的东西。 基本上我喜欢传入lambdas的想法,所以我得到编译时检查,但我不知道我在如何在这种特殊情况下使用它们的想法是可行的。

谢谢

这是我使用的版本,它返回一个PropertyInfo ,但获取名称是微不足道的。

 public static PropertyInfo GetProperty(Expression> expression) { MemberExpression memberExpression = null; if (expression.Body.NodeType == ExpressionType.Convert) { memberExpression = ((UnaryExpression) expression.Body).Operand as MemberExpression; } else if (expression.Body.NodeType == ExpressionType.MemberAccess) { memberExpression = expression.Body as MemberExpression; } if (memberExpression == null) { throw new ArgumentException("Not a member access", "expression"); } return memberExpression.Member as PropertyInfo; } 

在这个博客上,这是一个非常简单快捷的方法: http : //blog.bittercoder.com/PermaLink,guid,206e64d1-29ae-4362-874b-83f5b103727f.aspx

所以给出:

Func func = Name =>“Value”;

您可以通过调用以下函数从函数委托中获取lambda参数“Name”:

func.Method.GetParameters()[0] .Name(将返回“Name”)

这是Andrey的修订后的Hash方法:

 public Dictionary Hash(params Func[] args) where T : class { var items = new Dictionary(); foreach (var func in args) { var item = func(null); items.Add(func.Method.GetParameters()[0].Name, item); } return items; } 

帕特里克希望它有所帮助

像这样的东西应该做的伎俩:

 public static string GetPropertyName(this IList list, Expression> expr) { MemberExpression member_expression = expr.Body as MemberExpression; if (member_expression == null) throw new ArgumentNullException("member_expression"); MemberInfo member = member_expression.Member; PropertyInfo property = member as PropertyInfo; string proname = memeber.name; } 

警告:空气代码!

只是旁注: func.Method.GetParameters()[0] .Name与编译lambda并提取成员表达式,然后是成员信息,然后是名称相比,速度极快。