#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); } }
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)); }
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> > (); } }