如何获取F的Func中使用的属性名称字符串

我有一个场景,我必须得到一个字符串数组,代表Func参数中使用的每个属性名称。 这是一个示例实现:

public class CustomClass { public string[] GetPropertiesUsed { get { // do magical parsing based upon parameter passed into CustomMethod } } public void CustomMethod(Func method) { // do stuff } } 

这是一个示例用法:

 var customClass = new CustomClass(); customClass.CustomMethod(src => "(" + src.AreaCode + ") " + src.Phone); ... var propertiesUsed = customClass.GetPropertiesUsed; // propertiesUsed should contain ["AreaCode", "Phone"] 

我在上面坚持的部分是“根据传递给CustomMethod的参数进行神奇的解析”。

您需要更改CustomMethod以获取Expression> ,并可能VisitMember ExpressionVisitor ,重写VisitMember

 public void CustomMethod(Expression> method) { PropertyFinder lister = new PropertyFinder(); properties = lister.Parse((Expression) expr); } // this will be what you want to return from GetPropertiesUsed List properties; public class PropertyFinder : ExpressionVisitor { public List Parse(Expression expression) { properties.Clear(); Visit(expression); return properties; } List properties = new List(); protected override Expression VisitMember(MemberExpression m) { // look at m to see what the property name is and add it to properties ... code here ... // then return the result of ExpressionVisitor.VisitMember return base.VisitMember(m); } } 

这应该让你开始朝着正确的方向前进。 如果您需要帮助找出“……代码……”部分,请告诉我。

有用的链接:

  • 表达树
  • 如何修改表达式树
  • ExpressionVisitor
  • VisitMember
  • MemberExpression

您应该使用Expression>类。 表达式包含实际的树,并且可以很容易地被编译以获得委托(这是一个func)。 你真正想做的是看表达的主体和理由。 Expression类为您提供所有必要的基础结构。