开发者

query properties of an object with linq

I want to scan a type for it's properties and the annotated attributes and return an object with the following structure

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

    public object SourceType { get; set; }

    public Attribute Annotation { get; set; }
}

I have this query

var query = from property in _target.GetType().GetProperties()
            from attribute in Attribute.GetCustomAttributes(property, true)
            select new Proper开发者_Python百科tyContext
            {
                Annotation = attribute,
                SourceType = _target,                                            
             };

This is executed deferred so i only generate the PropertyContext while the calling method needs them.


Now i want to fill the PropertyValue property of the PropertyContext object.

To get the value of the property i have have a call to an other component like this

_propertyValueAccessor.GetValue(_target, property)  

My question is, how i can modify the query in a way that *

  • the value is only read once
  • but only if a PropertyContext is created


How about:

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,
            };
0

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜