Как я могу получить строки имени свойства, используемые в Func of T - PullRequest
3 голосов
/ 18 января 2011

У меня есть сценарий, в котором мне нужно получить массив строк, которые представляют каждое из имен свойств, используемых в параметре Func.Вот пример реализации:

public class CustomClass<TSource>
{
  public string[] GetPropertiesUsed
  {
    get
    {
      // do magical parsing based upon parameter passed into CustomMethod
    }
  }

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

Вот пример использования:

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

...

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

Часть, на которой я застрял в приведенном выше примере, - это "магический анализна основе параметра, переданного в CustomMethod. "

Ответы [ 2 ]

10 голосов
/ 18 января 2011

Вы должны использовать класс Expression<Func<>>. Выражение содержит фактическое дерево и может быть легко выполнено для получения делегата (который является функцией). То, что Вы действительно пытаетесь сделать, это посмотреть на тело выражения и рассуждать об этом. Класс Expression предоставляет Вам всю необходимую инфраструктуру.

6 голосов
/ 18 января 2011

Вам нужно будет изменить свой CustomMethod на Expression<Func<TSource, object>> и, возможно, подкласс ExpressionVisitor, переопределяя 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);
    }
}

Это должно привести вас в правильном направлении. Дайте мне знать, если вам нужна помощь в выяснении части "... код здесь ...".

Полезные ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...