internal static IMemberAccessor GetNamedAccessor(Type type, string name, MemberNameStrategy strategy) { var typeMembers = GetTypeMembers(type, strategy); if (typeMembers.TryGetValue(name, out var result)) { return(result); } return(null); }
internal static Dictionary <string, IMemberAccessor> GetTypeMembers(Type type, MemberNameStrategy memberNameStrategy) { return(_typeMembers.GetOrAdd(type, t => { var list = new Dictionary <string, IMemberAccessor>(); foreach (var propertyInfo in t.GetTypeInfo().GetProperties(BindingFlags.Public | BindingFlags.Instance)) { if (propertyInfo.GetIndexParameters().Length > 0) { // Indexed property... continue; } list[memberNameStrategy(propertyInfo)] = new PropertyInfoAccessor(propertyInfo); } foreach (var fieldInfo in t.GetTypeInfo().GetFields(BindingFlags.Public | BindingFlags.Instance)) { list[memberNameStrategy(fieldInfo)] = new DelegateAccessor((o, n) => fieldInfo.GetValue(o)); } return list; })); }
internal static Dictionary <string, IMemberAccessor> GetTypeMembers(Type type, MemberNameStrategy memberNameStrategy) { return(_typeMembers.GetOrAdd(type, t => { var list = new Dictionary <string, IMemberAccessor>(); foreach (var propertyInfo in t.GetTypeInfo().GetProperties(BindingFlags.Public | BindingFlags.Instance)) { if (propertyInfo.GetIndexParameters().Length > 0) { // Indexed property... continue; } if (propertyInfo.PropertyType.IsGenericType && propertyInfo.PropertyType.GetGenericTypeDefinition() == typeof(Task <>)) { list[memberNameStrategy(propertyInfo)] = new AsyncDelegateAccessor(async(o, n) => { var asyncValue = (Task)propertyInfo.GetValue(o); await asyncValue.ConfigureAwait(false); return (object)((dynamic)asyncValue).Result; }); } else { list[memberNameStrategy(propertyInfo)] = new PropertyInfoAccessor(propertyInfo); } } foreach (var fieldInfo in t.GetTypeInfo().GetFields(BindingFlags.Public | BindingFlags.Instance)) { if (fieldInfo.FieldType.IsGenericType && fieldInfo.FieldType.GetGenericTypeDefinition() == typeof(Task <>)) { list[memberNameStrategy(fieldInfo)] = new AsyncDelegateAccessor(async(o, n) => { var asyncValue = (Task)fieldInfo.GetValue(o); await asyncValue.ConfigureAwait(false); return (object)((dynamic)asyncValue).Result; }); } else { list[memberNameStrategy(fieldInfo)] = new DelegateAccessor((o, n) => fieldInfo.GetValue(o)); } } return list; })); }
public MemberAccessStrategy(IMemberAccessStrategy parent) : this() { _parent = parent; MemberNameStrategy = _parent.MemberNameStrategy; }