public static TValue GetAttributeValue <TValue, TAttribute>(this MemberInfo memberInfo, Func <TAttribute, TValue> getter, TValue defaultValue = default(TValue), bool inherit = true)
            where TAttribute : Attribute
        {
            memberInfo.AssertParameterNotNull(nameof(memberInfo));
            getter = getter.AssertParameterNotNull(nameof(getter));

            var attr = memberInfo.GetCustomAttribute <TAttribute>(inherit);

            return(attr == null ? defaultValue : getter(attr));
        }
        public static bool IsStatic(this MemberInfo memberInfo)
        {
            memberInfo.AssertParameterNotNull(nameof(memberInfo));
            switch (memberInfo.MemberType)
            {
            case MemberTypes.Event: return(((EventInfo)memberInfo).GetAddMethod().IsStatic);

            case MemberTypes.Field: return(((FieldInfo)memberInfo).IsStatic);

            case MemberTypes.Method: return(((MethodInfo)memberInfo).IsStatic);

            case MemberTypes.Property: return(((PropertyInfo)memberInfo).GetGetMethod(false).IsStatic);

            case MemberTypes.Constructor: return(((ConstructorInfo)memberInfo).IsStatic);

            case MemberTypes.TypeInfo: return(((Type)memberInfo).IsAbstract && ((Type)memberInfo).IsSealed);

            case MemberTypes.NestedType: return(((Type)memberInfo).IsAbstract && ((Type)memberInfo).IsSealed);

            default: throw new NotSupportedException();
            }
        }