Exemplo n.º 1
0
        internal MemberSettingContext(object owner, MemberPathSegment memberToken, Func <T> valueFactory, MemberGettingContext parent = null) : base(owner, memberToken, parent)
        {
            if (valueFactory == null)
            {
                throw new ArgumentNullException(nameof(valueFactory));
            }

            _valueFactory = valueFactory;
        }
        internal static void SetMemberValueCore <T>(object owner, MemberPathSegment member, Func <T> valueFactory, bool throwsOnError)
        {
            if (owner == null)
            {
                throw new ArgumentNullException(nameof(owner));
            }

            var type       = owner is Type ? (Type)owner : owner.GetType();
            var memberInfo = GetMemberInfo(type, member);

            //如果没有找到指定的成员
            if (memberInfo == null)
            {
                if (throwsOnError)
                {
                    throw new ArgumentException(string.Format("The '{0}' member is not exists in the '{1}' type.", member, (owner is Type ? ((Type)owner).FullName : owner.GetType().FullName)));
                }

                return;
            }

            try
            {
                switch (memberInfo.MemberType)
                {
                case MemberTypes.Field:
                    ((FieldInfo)memberInfo).SetValue(owner, valueFactory());
                    break;

                case MemberTypes.Property:
                    ((PropertyInfo)memberInfo).SetValue(owner, valueFactory());
                    break;

                default:
                    if (throwsOnError)
                    {
                        throw new InvalidOperationException($"Dont support set value of '{member}' member in the '{type}' type.");
                    }
                    return;
                }
            }
            catch
            {
                if (throwsOnError)
                {
                    throw;
                }
            }
        }
        internal static MemberInfo GetMemberInfo(object owner, MemberPathSegment segment)
        {
            if (owner == null)
            {
                return(null);
            }

            var type = owner is Type ? (Type)owner : owner.GetType();

            var members = type.FindMembers(MemberTypes.Field | MemberTypes.Property, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static, (member, criteria) =>
            {
                MemberPathSegment memberSegment = (MemberPathSegment)criteria;

                if (memberSegment.IsIndexer && member.MemberType == MemberTypes.Property)
                {
                    var parameters = ((PropertyInfo)member).GetIndexParameters();

                    if (parameters.Length != memberSegment.Parameters.Length)
                    {
                        return(false);
                    }

                    for (int i = 0; i < parameters.Length; i++)
                    {
                        if (parameters[i].ParameterType != memberSegment.Parameters[i].GetType())
                        {
                            return(false);
                        }
                    }

                    return(true);
                }

                return(string.Equals(member.Name, memberSegment.Name, StringComparison.OrdinalIgnoreCase));
            }, segment);

            if (members != null && members.Length > 0)
            {
                return(members[0]);
            }

            return(null);
        }
 internal MemberGettingContext(object owner, MemberPathSegment memberSegment, MemberGettingContext parent = null)
 {
     _owner         = owner ?? throw new ArgumentNullException(nameof(owner));
     _parent        = parent;
     _memberSegment = memberSegment;
 }
Exemplo n.º 5
0
 internal MemberSettingContext(object owner, MemberPathSegment memberToken, T value, MemberGettingContext parent = null) : base(owner, memberToken, parent)
 {
     _value          = value;
     _valueEvaluated = 1;
 }