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