コード例 #1
0
        public static bool GetMemberBoolean(this Type classType, object parentObject, string memberName)
        {
            MemberInfo member;

            TypeMemberPair cacheKey = new TypeMemberPair(classType, memberName);
            if (!memberInfoCache.TryGetValue(cacheKey, out member)) {
                // This member has not been searched for yet
                MemberInfo[] members = classType.GetMember(memberName, validValueTypes, bindingFlags);
                if (members.Length == 0) {
                    throw new KeyNotFoundException(
                        String.Format("No field, property or method called '{0}' was found on object of type '{1}'.",
                            memberName, classType));
                } else if (members.Length > 1) {
                    throw new AmbiguousMatchException(
                        String.Format("There are multiple members called '{0}' on object of type '{1}'.",
                            memberName, classType));
                }

                member = members[0];
                // Let's cache the damn thing
                memberInfoCache.Add(cacheKey, member);
            }

            if (member.MemberType == MemberTypes.Field) {
                FieldInfo field = (FieldInfo)member;
                if (typeof(bool).IsAssignableFrom(field.FieldType)) {
                    return (bool)field.GetValue(parentObject);
                } else {
                    throw new InvalidCastException(String.Format("The requested field '{1}.{0}' needs to be a boolean.",
                        memberName, classType));
                }

            } else if (member.MemberType == MemberTypes.Method) {
                MethodInfo method = (MethodInfo)member;
                if (typeof(bool).IsAssignableFrom(method.ReturnType) && method.GetParameters().Length == 0) {
                    return (bool)method.Invoke(parentObject, null);
                } else {
                    throw new InvalidCastException(String.Format(
                        "The requested method '{1}.{0}' needs to have a bool return type and no parameters.",
                        memberName, classType));
                }
            } else {
                PropertyInfo property = (PropertyInfo)member;
                if (typeof(bool).IsAssignableFrom(property.PropertyType) && property.CanRead) {
                    return (bool)property.GetValue(parentObject, null);
                } else {
                    throw new InvalidCastException(String.Format(
                        "The requested property '{1}.{0}' needs to be a boolean and have a get method defined.",
                        memberName, classType));
                }
            }
        }
コード例 #2
0
        public static bool GetMemberBoolean(this Type classType, object parentObject, string memberName)
        {
            MemberInfo member;

            TypeMemberPair cacheKey = new TypeMemberPair(classType, memberName);

            if (!memberInfoCache.TryGetValue(cacheKey, out member))
            {
                // This member has not been searched for yet
                MemberInfo[] members = classType.GetMember(memberName, validValueTypes, bindingFlags);
                if (members.Length == 0)
                {
                    throw new KeyNotFoundException(
                              String.Format("No field, property or method called '{0}' was found on object of type '{1}'.",
                                            memberName, classType));
                }
                else if (members.Length > 1)
                {
                    throw new AmbiguousMatchException(
                              String.Format("There are multiple members called '{0}' on object of type '{1}'.",
                                            memberName, classType));
                }

                member = members[0];
                // Let's cache the damn thing
                memberInfoCache.Add(cacheKey, member);
            }

            if (member.MemberType == MemberTypes.Field)
            {
                FieldInfo field = (FieldInfo)member;
                if (typeof(bool).IsAssignableFrom(field.FieldType))
                {
                    return((bool)field.GetValue(parentObject));
                }
                else
                {
                    throw new InvalidCastException(String.Format("The requested field '{1}.{0}' needs to be a boolean.",
                                                                 memberName, classType));
                }
            }
            else if (member.MemberType == MemberTypes.Method)
            {
                MethodInfo method = (MethodInfo)member;
                if (typeof(bool).IsAssignableFrom(method.ReturnType) && method.GetParameters().Length == 0)
                {
                    return((bool)method.Invoke(parentObject, null));
                }
                else
                {
                    throw new InvalidCastException(String.Format(
                                                       "The requested method '{1}.{0}' needs to have a bool return type and no parameters.",
                                                       memberName, classType));
                }
            }
            else
            {
                PropertyInfo property = (PropertyInfo)member;
                if (typeof(bool).IsAssignableFrom(property.PropertyType) && property.CanRead)
                {
                    return((bool)property.GetValue(parentObject, null));
                }
                else
                {
                    throw new InvalidCastException(String.Format(
                                                       "The requested property '{1}.{0}' needs to be a boolean and have a get method defined.",
                                                       memberName, classType));
                }
            }
        }