Exemplo n.º 1
0
        public OptionalReadWriteMemberSerializationMediatorDecorator([NotNull] IMemberSerializationMediator <TContainingType> mediator, [NotNull] string memberName)
        {
            if (mediator == null)
            {
                throw new ArgumentNullException(nameof(mediator));
            }
            if (string.IsNullOrWhiteSpace(memberName))
            {
                throw new ArgumentException("Value cannot be null or whitespace.", nameof(memberName));
            }

            //Get member and check no ambious matches
            MemberInfo[] info = typeof(TContainingType)
                                .GetTypeInfo()
                                .GetMember(memberName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);

            if (info == null || info.Length == 0)
            {
                throw new InvalidOperationException($"Didn't find Member: {memberName} for Optional functionality on Type: {typeof(TContainingType).Name}. Make sure the member is implemented on the Type. Use nameof for compile time safety.");
            }
            if (info.Length > 1)
            {
                throw new InvalidOperationException($"Found ambigious Member: {memberName} for Optional functionality on Type: {typeof(TContainingType).Name}.");
            }

            isReadWriteEnabledGetter = new MemberGetterMediator <TContainingType>(info.First());

            DecoratedMediator = mediator;
        }
        public DisableWriteMemberSerializationMediatorDecorator([NotNull] IMemberSerializationMediator <TContainingType> decoratedMediator)
        {
            if (decoratedMediator == null)
            {
                throw new ArgumentNullException(nameof(decoratedMediator));
            }

            this.decoratedMediator = decoratedMediator;
        }
Exemplo n.º 3
0
        public IMemberSerializationMediator <TContainingType> Create <TContainingType>(MemberInfo info)
        {
            if (info == null)
            {
                throw new ArgumentNullException(nameof(info));
            }

            ITypeSerializerStrategy strategy = typeSerializerProvider.Get(lookupKeyFactory.Create(info));
            //Construct a default and then we can decorate as needed
            //We now have a generic arg for the member type which we don't technically have a compile time ref to
            //therefore we must use activator to create
            IMemberSerializationMediator <TContainingType> mediator =
                Activator.CreateInstance(typeof(DefaultMemberSerializationMediator <,>).MakeGenericType(new Type[] { typeof(TContainingType), info.Type() }),
                                         info, strategy) as IMemberSerializationMediator <TContainingType>;

            //TODO: Do checking and exceptions for mediator failure

            //Check for seperated collection size attributes. We need to decorate for each one this is linked to
            foreach (var attri in info.DeclaringType.GetTypeInfo().GetCustomAttributes <SeperatedCollectionSizeAttribute>(false))
            {
                //[NotNull] MemberInfo sizeMemberInfo, [NotNull] MemberInfo collectionMemberInfo, [NotNull] ITypeSerializerStrategy serializer, [NotNull] IMemberSerializationMediator<TContainingType> decoratedMediator)
                if (attri.SizePropertyName == info.Name)
                {
                    MemberInfo collectionMember = info.DeclaringType.GetTypeInfo().GetMember(attri.CollectionPropertyName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public).First();

                    mediator = Activator.CreateInstance(typeof(ConnectedCollectionSizeSerializationMediator <,>).MakeGenericType(new Type[] { typeof(TContainingType), info.Type() }),
                                                        info, collectionMember, strategy, mediator) as IMemberSerializationMediator <TContainingType>;
                }

                //TODO: Undefined behavior if we have to decorate this multiple times
                if (attri.CollectionPropertyName == info.Name)
                {
                    MemberInfo sizeMember = info.DeclaringType.GetTypeInfo().GetMember(attri.SizePropertyName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public).First();

                    mediator = Activator.CreateInstance(typeof(ConnectedCollectionCollectionSerializationMediator <, ,>).MakeGenericType(new Type[] { typeof(TContainingType), sizeMember.Type(), info.Type() }),
                                                        info, sizeMember, strategy, mediator) as IMemberSerializationMediator <TContainingType>;
                }
            }

            if (info.HasAttribute <DontWriteAttribute>())
            {
                mediator = new DisableWriteMemberSerializationMediatorDecorator <TContainingType>(mediator);
            }

            if (info.HasAttribute <DontReadAttribute>())
            {
                mediator = new DisableReadMemberSerializationMediatorDecorator <TContainingType>(mediator);
            }

            if (info.HasAttribute <OptionalAttribute>())
            {
                mediator = new OptionalReadWriteMemberSerializationMediatorDecorator <TContainingType>(mediator, info.GetCustomAttribute <OptionalAttribute>().MemberName);
            }

            return(mediator);
        }
        /// <inheritdoc />
        public ConnectedCollectionCollectionSerializationMediator([NotNull] MemberInfo collectionMemberInfo, [NotNull] MemberInfo sizeMemberInfo, [NotNull] ITypeSerializerStrategy serializer, [NotNull] IMemberSerializationMediator <TContainingType> decoratedMediator)
            : base(collectionMemberInfo, serializer)
        {
            if (collectionMemberInfo == null)
            {
                throw new ArgumentNullException(nameof(collectionMemberInfo));
            }
            if (decoratedMediator == null)
            {
                throw new ArgumentNullException(nameof(decoratedMediator));
            }

            SizeMemberGetter  = new MemberGetterMediator <TContainingType>(sizeMemberInfo);
            DecoratedMediator = decoratedMediator;
        }