コード例 #1
0
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
        public override async Task SetValueAsync <TValue> (object target, TValue value)
        {
            IReadOnlyList <T> values = value as IReadOnlyList <T>;

            if (values != null)
            {
                if (!IsValueCombinable)
                {
                    throw new ArgumentException("Can not set a combined value on a non-combinable type", nameof(value));
                }

                Func <T, T, T> or = DynamicBuilder.GetOrOperator <T> ();

                T realValue = values.Count > 0 ? values[0] : default(T);
                for (int i = 1; i < values.Count; i++)
                {
                    realValue = or(realValue, values[i]);
                }

                PropertyInfo.SetValue(target, realValue);
            }
            else
            {
                object convertedValue = Enum.ToObject(PropertyInfo.PropertyType, value);
                PropertyInfo.SetValue(target, convertedValue);
            }
        }
コード例 #2
0
        public override async Task <TValue> GetValueAsync <TValue> (object target)
        {
            if (typeof(TValue) == typeof(IReadOnlyList <T>))
            {
                T realValue = (T)PropertyInfo.GetValue(target);

                Func <T, T, bool> hasFlag = DynamicBuilder.GetHasFlagMethod <T> ();

                List <T> values = new List <T> ();
                foreach (T value in PredefinedValues.Values)
                {
                    if (hasFlag(realValue, value))
                    {
                        values.Add(value);
                    }
                }

                Func <object, TValue> caster = DynamicBuilder.GetCaster <TValue> ();
                return(caster(values));
            }

            return((TValue)PropertyInfo.GetValue(target));
        }
コード例 #3
0
        public ReflectionEnumPropertyInfo(PropertyInfo propertyInfo)
            : base(propertyInfo)
        {
            string[] names  = Enum.GetNames(propertyInfo.PropertyType);
            Array    values = Enum.GetValues(propertyInfo.PropertyType);

            var predefinedValues = new Dictionary <string, T> (names.Length);

            for (int i = 0; i < names.Length; i++)
            {
                predefinedValues.Add(names[i], (T)values.GetValue(i));
            }

            PredefinedValues = predefinedValues;

            FlagsAttribute flags = PropertyInfo.PropertyType.GetCustomAttribute <FlagsAttribute> ();

            if (IsValueCombinable = flags != null)
            {
                DynamicBuilder.RequestOrOperator <T> ();
                DynamicBuilder.RequestHasFlagMethod <T> ();
                DynamicBuilder.RequestCaster <IReadOnlyList <T> > ();
            }
        }