Exemple #1
0
        public static MemberInfo FindMember(Type type, string memberName, BindingContract contract)
        {
            MemberInfo memberInfo;

            if (contract.MemberType.ContainsAll(MemberTypes.Property))
            {
#if !WINDOWS_UWP && !HAS_CRIPPLEDREFLECTION
                memberInfo = type.GetProperty(memberName, contract.BindingFlags, null, contract.ReturnType,
                                              contract.SafeTypes, null);
#elif HAS_CRIPPLEDREFLECTION && !HAS_TYPEINFO
                memberInfo = type.GetProperty(memberName, contract.ReturnType, contract.SafeTypes);
#else
                memberInfo = type.GetTypeInfo().GetDeclaredProperty(memberName);
#endif

                if (memberInfo != null)
                {
                    return(memberInfo);
                }
            }

            if (contract.MemberType.ContainsAll(MemberTypes.Event))
            {
#if !WINDOWS_UWP && !HAS_CRIPPLEDREFLECTION
                memberInfo = type.GetEvent(memberName, contract.BindingFlags);
#else
                memberInfo = type.GetTypeInfo().GetDeclaredEvent(memberName);
#endif

                if (memberInfo != null)
                {
                    return(memberInfo);
                }
            }

            if (contract.MemberType.ContainsAll(MemberTypes.Field))
            {
#if !WINDOWS_UWP && !HAS_CRIPPLEDREFLECTION
                memberInfo = type.GetField(memberName, contract.BindingFlags);
#else
                memberInfo = type.GetTypeInfo().GetDeclaredField(memberName);
#endif

                if (memberInfo != null)
                {
                    return(memberInfo);
                }
            }

            if (contract.MemberType.ContainsAll(MemberTypes.Method))
            {
#if !WINDOWS_UWP && !HAS_CRIPPLEDREFLECTION
                memberInfo = contract.Types == null
                                 ? type.GetMethod(memberName, contract.BindingFlags)
                                 : type.GetMethod(memberName, contract.BindingFlags, null, contract.Types, null);
#elif HAS_CRIPPLEDREFLECTION && !HAS_TYPEINFO
                memberInfo = contract.Types == null
                                                                 ? type.GetMethod(memberName, contract.BindingFlags)
                                                                 : type.GetMethod(memberName, contract.Types);
#else
                memberInfo = type.GetTypeInfo()
                             .GetDeclaredMethods(memberName)
                             .FirstOrDefault(
                    m => m.GetParameters().Select(p => p.ParameterType).Equality().Equal(contract.Types)
                    );
#endif

                if (memberInfo != null)
                {
                    return(memberInfo);
                }
            }

            if (contract.MemberType.ContainsAll(MemberTypes.NestedType))
            {
#if !WINDOWS_UWP
                memberInfo = type.GetNestedType(memberName, contract.BindingFlags);
#else
                memberInfo = type.GetTypeInfo().GetDeclaredNestedType(memberName);
#endif
                if (memberInfo != null)
                {
                    return(memberInfo);
                }
            }

            return(null);
        }