Пример #1
0
        public static IEnumerable <SettableInfo> Decompose <T, U>(Expression <PropertyPath <T, U> .Property> property)
        {
            List <SettableInfo> properties = new List <SettableInfo>();

            Expression body = property.Body;

            while (!(body is ParameterExpression))
            {
                var bodyUe = body as UnaryExpression;

                if (bodyUe != null)
                {
                    MemberExpression memEx = bodyUe.Operand as MemberExpression;
                    properties.Add(SettableInfo.New(memEx.Member));

                    body = memEx.Expression;
                    continue;
                }

                var bodyMe = body as MemberExpression;

                if (bodyMe != null)
                {
                    properties.Add(SettableInfo.New(bodyMe.Member));

                    body = bodyMe.Expression;
                    continue;
                }
            }

            return(properties.Reverse <SettableInfo>());
        }
Пример #2
0
        public static SettableInfo[] GetSettables(this Type type)
        {
            var fields     = type.GetFields().Select(z => SettableInfo.New(z));
            var properties = type.GetProperties().Select(z => SettableInfo.New(z));

            return(fields.Concat(properties).ToArray());
        }
Пример #3
0
        public object Get(object source)
        {
            object target = source;

            for (int n = 0; n < _properties.Length; n++)
            {
                SettableInfo property = _properties[n];

                target = property.GetValue(target);

                if ((n != _properties.Length - 1) && target == null)
                {
                    target = TryToCreateTarget(property.PropertyType);
                }
            }

            return(target);
        }
Пример #4
0
        public void Set(object target, object value)
        {
            for (int n = 0; n < _properties.Length; n++)
            {
                SettableInfo property = _properties[n];

                if (n == _properties.Length - 1)
                {
                    property.SetValue(target, value);
                }
                else
                {
                    object lastTarget = target;
                    target = property.GetValue(target);

                    if (target == null)
                    {
                        target = TryToCreateTarget(property.PropertyType);
                        property.SetValue(lastTarget, target);
                    }
                }
            }
        }