public void AddConverter(Type targetType, IKeyValueConverter converter)
        {
            if (targetType == null)
            {
                throw new ArgumentNullException(nameof(targetType));
            }

            if (converter == null)
            {
                throw new ArgumentNullException(nameof(converter));
            }

            if (_convertersBuilder.ContainsKey(targetType))
            {
                throw new ArgumentException($"Type {targetType.FullName} already has a keyvalue converter", nameof(targetType));
            }

            _convertersBuilder.Add(targetType, converter);
        }
        public void AddConvertersFromAssembly(Assembly assembly)
        {
            if (assembly == null)
            {
                throw new ArgumentNullException(nameof(assembly));
            }

            //Allow redundant additions (if client and server add the same assemblies)
            if (_referencedAssemblies.Contains(assembly))
            {
                return;
            }

            _referencedAssemblies.Add(assembly);

            foreach (var type in assembly.DefinedTypes.Where(t => typeof(IKeyValueConverter).IsAssignableFrom(t) && t.IsPublic))
            {
                IKeyValueConverter converter = null;

                foreach (var attr in type.GetCustomAttributes <KeyValueConverterAttribute>())
                {
                    if (attr.Type == null)
                    {
                        throw new ArgumentException(nameof(KeyValueConverterAttribute) + " " + nameof(KeyValueConverterAttribute.Type) + " must be non-null");
                    }

                    if (_convertersBuilder.ContainsKey(attr.Type))
                    {
                        throw new ArgumentException($"Type {attr.Type.FullName} already has a keyvalue converter");
                    }

                    //Create one instance for N type conversions
                    if (converter == null)
                    {
                        converter = (IKeyValueConverter)Activator.CreateInstance(type);
                    }

                    _convertersBuilder.Add(attr.Type, converter);
                }
            }
        }
Пример #3
0
 public void AddKeyValueConverter(Type targetType, IKeyValueConverter converter) => _keyValueConverters.AddConverter(targetType, converter);
 public KeyValueMetaData(MemberInfo member, Type memberType, IKeyValueConverter converter)
 {
     Member     = member ?? throw new ArgumentNullException(nameof(member));
     MemberType = memberType ?? throw new ArgumentNullException(nameof(memberType));
     Converter  = converter ?? throw new ArgumentNullException(nameof(converter));
 }