コード例 #1
0
        public bool TryGetPropertyInitializer <TProperty>(PropertyInfo propertyInfo, out IPropertyInitializer <TMessage, TInput> initializer)
        {
            var propertyName = propertyInfo?.Name ?? throw new ArgumentNullException(nameof(propertyInfo));

            if (_inputProperties.TryGetValue(propertyName, out var inputPropertyInfo))
            {
                var propertyType      = typeof(TProperty);
                var inputPropertyType = inputPropertyInfo.PropertyType;

                // exactly the same type, we just copy it over unmodified
                if (inputPropertyType == propertyType)
                {
                    initializer = new CopyPropertyInitializer <TMessage, TInput, TProperty>(propertyInfo, inputPropertyInfo);
                    return(true);
                }

                // can only copy to object, no idea what the destination type would/could be
                if (propertyType == typeof(object))
                {
                    var type = typeof(CopyObjectPropertyInitializer <, ,>).MakeGenericType(typeof(TMessage), typeof(TInput), inputPropertyType);
                    initializer = (IPropertyInitializer <TMessage, TInput>)Activator.CreateInstance(type, propertyInfo, inputPropertyInfo);
                    return(true);
                }

                if (_providerFactory.TryGetPropertyProvider(inputPropertyInfo, out IPropertyProvider <TInput, TProperty> provider))
                {
                    initializer = new ProviderPropertyInitializer <TMessage, TInput, TProperty>(provider, propertyInfo);
                    return(true);
                }
            }

            initializer = null;
            return(false);
        }
コード例 #2
0
        public void Set <TProperty>(Expression <Func <TMessage, TProperty> > propertyExpression, TProperty value)
        {
            var propertyInfo = propertyExpression.GetPropertyInfo();

            var valueProvider = new ConstantPropertyProvider <TMessage, TProperty>(value);

            var initializer = new ProviderPropertyInitializer <TMessage, TMessage, TProperty>(valueProvider, propertyInfo);

            _convention.Add(propertyInfo.Name, initializer);
        }
コード例 #3
0
        public void Set <TProperty>(Expression <Func <TMessage, TProperty> > propertyExpression,
                                    Func <TransformPropertyContext <TProperty, TMessage>, TProperty> valueProvider)
        {
            var propertyInfo = propertyExpression.GetPropertyInfo();

            var inputValueProvider = new InputPropertyProvider <TMessage, TProperty>(propertyInfo);

            Task <TProperty> PropertyProvider(TransformPropertyContext <TProperty, TMessage> context)
            {
                return(Task.FromResult(valueProvider(context)));
            }

            var propertyProvider = new DelegatePropertyProvider <TMessage, TProperty>(inputValueProvider, PropertyProvider);

            var initializer = new ProviderPropertyInitializer <TMessage, TMessage, TProperty>(propertyProvider, propertyInfo);

            _convention.Add(propertyInfo.Name, initializer);
        }
コード例 #4
0
        public bool TryGetPropertyInitializer <TProperty>(PropertyInfo propertyInfo, out IPropertyInitializer <TMessage, TInput> initializer)
        {
            var key = propertyInfo?.Name ?? throw new ArgumentNullException(nameof(propertyInfo));

            if (typeof(TValue) == typeof(TProperty))
            {
                initializer = new DictionaryCopyPropertyInitializer <TMessage, TInput, TValue>(propertyInfo, key);
                return(true);
            }

            if (_providerFactory.TryGetPropertyConverter(out IPropertyConverter <TProperty, TValue> converter))
            {
                var providerType = typeof(InputDictionaryPropertyProvider <,>).MakeGenericType(typeof(TInput), typeof(TValue));

                var provider = (IPropertyProvider <TInput, TValue>)Activator.CreateInstance(providerType, key);

                var convertProvider = new PropertyConverterPropertyProvider <TInput, TProperty, TValue>(converter, provider);

                initializer = new ProviderPropertyInitializer <TMessage, TInput, TProperty>(convertProvider, propertyInfo);
                return(true);
            }

            if (typeof(TValue) == typeof(object))
            {
                var inputProviderType = typeof(InputDictionaryPropertyProvider <,>).MakeGenericType(typeof(TInput), typeof(TValue));

                var valueProvider = (IPropertyProvider <TInput, TValue>)Activator.CreateInstance(inputProviderType, key);

                var providerType = typeof(ObjectPropertyProvider <,>).MakeGenericType(typeof(TInput), typeof(TProperty));

                var provider = (IPropertyProvider <TInput, TProperty>)Activator.CreateInstance(providerType, _providerFactory, valueProvider);

                initializer = new ProviderPropertyInitializer <TMessage, TInput, TProperty>(provider, propertyInfo);
                return(true);
            }

            initializer = null;
            return(false);
        }
コード例 #5
0
        public void Set <TProperty>(PropertyInfo propertyInfo, IPropertyProvider <TMessage, TProperty> propertyProvider)
        {
            var initializer = new ProviderPropertyInitializer <TMessage, TMessage, TProperty>(propertyProvider, propertyInfo);

            _convention.Add(propertyInfo.Name, initializer);
        }