开发者

How can I get property name strings used in a Func of T

开发者 https://www.devze.com 2023-02-05 03:12 出处:网络
I have a scenario where I have to get an array of strings that represent each of the property names used within a Func parameter.Here is an example implementation:

I have a scenario where I have to get an array of strings that represent each of the property names used within a Func parameter. Here is an example implementation:

public class CustomClass<TSource>
{
  public string[] GetPro开发者_C百科pertiesUsed
  {
    get
    {
      // do magical parsing based upon parameter passed into CustomMethod
    }
  }

  public void CustomMethod(Func<TSource, object> method)
  {
    // do stuff
  }
}

Here would be an example usage:

var customClass = new CustomClass<Person>();
customClass.CustomMethod(src => "(" + src.AreaCode + ") " + src.Phone);

...

var propertiesUsed = customClass.GetPropertiesUsed;
// propertiesUsed should contain ["AreaCode", "Phone"]

The part I'm stuck on in the above is the "do magical parsing based upon parameter passed into CustomMethod."


You should use Expression<Func<>> class instead. The expression contains actual tree, and can easily be complied to get a delegate (which is a func). What You are really trying to do is to look at the body of the expression and reason about it. Expression class provides You with all the neccessary infrastructure.


You'll need to change your CustomMethod to take an Expression<Func<TSource, object>>, and probably subclass the ExpressionVisitor, overriding VisitMember:

public void CustomMethod(Expression<Func<TSource, object>> method)
{
     PropertyFinder lister = new PropertyFinder();
     properties = lister.Parse((Expression) expr);
}

// this will be what you want to return from GetPropertiesUsed
List<string> properties;

public class PropertyFinder : ExpressionVisitor
{
    public List<string> Parse(Expression expression)
    {
        properties.Clear();
        Visit(expression);
        return properties;
    }

    List<string> properties = new List<string>();

    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);
    }
}

This should get you started in the right direction. Let me know if you need some help figuring out the "... code here ..." part.

Useful links:

  • Expression Trees
  • How to Modify Expression Trees
  • ExpressionVisitor
  • VisitMember
  • MemberExpression
0

精彩评论

暂无评论...
验证码 换一张
取 消