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; }
internal MemberSettingContext(object owner, MemberPathSegment memberToken, T value, MemberGettingContext parent = null) : base(owner, memberToken, parent) { _value = value; _valueEvaluated = 1; }