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

            // headers use a double underscore prefix
            string inputPropertyName = new StringBuilder(propertyName.Length + 2).Append("__").Append(propertyName).ToString();

            if (_inputProperties.TryGetValue(inputPropertyName, 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 CopyHeaderInitializer <TMessage, TInput, TProperty>(propertyInfo, inputPropertyInfo);
                    return(true);
                }

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

            initializer = default;
            return(false);
        }
コード例 #2
0
        public bool TryGetHeadersInitializer <TProperty>(PropertyInfo propertyInfo, out IHeaderInitializer <TMessage, TInput> initializer)
        {
            if (propertyInfo.Name.StartsWith("__Header_") && propertyInfo.Name.Length > 9)
            {
                string headerName = propertyInfo.Name.Substring(9).Replace("__", " ").Replace("_", "-").Replace(" ", "_");

                var inputPropertyType = propertyInfo.PropertyType;

                // exactly the same type, we just copy it over unmodified
                if (inputPropertyType == typeof(string))
                {
                    initializer = new SetStringHeaderInitializer <TMessage, TInput>(headerName, propertyInfo);
                    return(true);
                }

                if (_providerFactory.TryGetPropertyProvider(propertyInfo, out IPropertyProvider <TInput, TProperty> provider))
                {
                    var type = typeof(SetHeaderInitializer <, ,>).MakeGenericType(typeof(TMessage), typeof(TInput), inputPropertyType);
                    initializer = (IHeaderInitializer <TMessage, TInput>)Activator.CreateInstance(type, headerName, provider);
                    return(true);
                }
            }

            initializer = default;
            return(false);
        }
コード例 #3
0
        public bool TryGetHeaderInitializer <TProperty>(PropertyInfo propertyInfo, out IHeaderInitializer <TMessage, TInput> initializer)
        {
            var propertyName = propertyInfo?.Name ?? throw new ArgumentNullException(nameof(propertyInfo));

            // headers use a double underscore prefix
            var key = new StringBuilder(propertyName.Length + 2).Append("__").Append(propertyName).ToString();

            if (typeof(TValue) == typeof(TProperty))
            {
                initializer = new DictionaryCopyHeaderInitializer <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, propertyName);

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

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

            initializer = default;
            return(false);
        }
コード例 #4
0
        public bool TryGetHeaderInitializer <TProperty>(string propertyName, out IHeaderInitializer <TMessage, TInput> initializer)
        {
            // headers use a double underscore prefix

            string inputPropertyName = new StringBuilder(propertyName.Length + 2).Append("__").Append(propertyName).ToString();

            var inputPropertyInfo = typeof(TInput).GetProperty(inputPropertyName);

            if (inputPropertyInfo != null)
            {
                var propertyType      = typeof(TProperty);
                var inputPropertyType = inputPropertyInfo.PropertyType;

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

                if (PropertyInitializerCache.TryGetFactory <TProperty>(inputPropertyType, out var propertyConverter))
                {
                    initializer = propertyConverter.CreateHeaderInitializer <TMessage, TInput>(propertyName, inputPropertyName);
                    return(true);
                }
            }

            initializer = default;
            return(false);
        }
コード例 #5
0
 public HeaderAdapter(IHeaderInitializer <TMessage> initializer)
 {
     _initializer = initializer;
 }
コード例 #6
0
 public void Add(IHeaderInitializer <TMessage, TInput> initializer)
 {
     _headerInitializers.Add(initializer);
 }
コード例 #7
0
 public void Add(IHeaderInitializer <TMessage> initializer)
 {
     _headerInitializers.Add(new HeaderAdapter(initializer));
 }
コード例 #8
0
 public bool TryGetHeadersInitializer <TProperty>(PropertyInfo propertyInfo, out IHeaderInitializer <TMessage, TInput> initializer)
 {
     initializer = default;
     return(false);
 }
コード例 #9
0
 public bool TryGetHeadersInitializer <TInput, TProperty>(PropertyInfo propertyInfo, out IHeaderInitializer <TMessage, TInput> initializer)
     where TInput : class
 {
     return(_typeCache.GetOrAdd <TInput, IInitializerConvention <TMessage, TInput> >().TryGetHeadersInitializer <TProperty>(propertyInfo, out initializer));
 }
コード例 #10
0
        bool IInitializerConvention.TryGetHeaderInitializer <T, TInput, TProperty>(PropertyInfo propertyInfo, out IHeaderInitializer <T, TInput> initializer)
        {
            if (this is IInitializerConvention <T, TInput> convention)
            {
                return(convention.TryGetHeaderInitializer <TProperty>(propertyInfo, out initializer));
            }

            initializer = default;
            return(false);
        }
コード例 #11
0
 public bool TryGetHeaderInitializer <TInput>(string propertyName, out IHeaderInitializer <TMessage, TInput> initializer)
     where TInput : class
 {
     return(_typeCache.GetOrAdd <TInput, IInitializerConvention <TMessage, TInput> >().TryGetHeaderInitializer(propertyName, out initializer));
 }