запросить свойства объекта с помощью linq - PullRequest
2 голосов
/ 04 марта 2011

Я хочу просканировать тип на предмет его свойств и аннотированных атрибутов и вернуть объект со следующей структурой

public class PropertyContext
{
    public object PropertyValue { get; set; }

    public object SourceType { get; set; }

    public Attribute Annotation { get; set; }
}

У меня есть этот запрос

var query = from property in _target.GetType().GetProperties()
            from attribute in Attribute.GetCustomAttributes(property, true)
            select new PropertyContext
            {
                Annotation = attribute,
                SourceType = _target,                                            
             };

Это выполнено отложенопоэтому я генерирую PropertyContext только тогда, когда они нужны вызывающему методу.


Теперь я хочу заполнить свойство PropertyValue объекта PropertyContext.

Чтобы получитьзначение свойства, которое у меня есть, вызывает другой компонент, подобный этому

_propertyValueAccessor.GetValue(_target, property)  

Мой вопрос: как я могу изменить запрос таким образом, чтобы *

  • значениечитается только один раз
  • , но только если создается PropertyContext

1 Ответ

3 голосов
/ 04 марта 2011

Как насчет:

var query = from property in _target.GetType().GetProperties()
            let attributes = Attribute.GetCustomAttributes(property, true)
            where attributes.Any()
            let val = _propertyValueAccessor.GetValue(_target, property)  
            from attribute in attributes
            select new PropertyContext
            {
                PropertyValue = val,
                Annotation = attribute,
                SourceType = _target,
            };
...