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); }
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); }
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); }
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); }
public void Set <TProperty>(PropertyInfo propertyInfo, IPropertyProvider <TMessage, TProperty> propertyProvider) { var initializer = new ProviderPropertyInitializer <TMessage, TMessage, TProperty>(propertyProvider, propertyInfo); _convention.Add(propertyInfo.Name, initializer); }