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);
        }
Пример #2
0
        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;
            }));
        }
Пример #4
0
 public MemberAccessStrategy(IMemberAccessStrategy parent) : this()
 {
     _parent            = parent;
     MemberNameStrategy = _parent.MemberNameStrategy;
 }