public static TAttribute[] GetCustomAttributesBasedOn <TAttribute>([NotNull] this ParameterInfo parameter) where TAttribute : Attribute { Fail.IfArgumentNull(parameter, nameof(parameter)); //Fail.IfArgumentNull(parameter.DeclaringType, nameof(parameter.DeclaringType)); object[] memberAttributes = parameter.GetCustomAttributes(inherit: true); MemberInfo[] interfaceMembers = CustomAttributeExtensions.GetInterfaceMembersImplementedBy(parameter.Member); ParameterInfo[] methodArguments = parameter.Member.CastOrFail <MethodInfo>().GetParameters(); var parameterIndex = Array.IndexOf(methodArguments, parameter); object[] interfaceAttributes = interfaceMembers.SelectMany(m => m.CastOrFail <MethodInfo>() .GetParameters()[parameterIndex] //.FailIfNull("Method {0}.{1}() should have argument {2}", m.DeclaringType, m.Name, parameter.Name) .GetCustomAttributes(inherit: true)) .ToArray(); IEnumerable <object> allAttributes = memberAttributes.Union(interfaceAttributes); TAttribute[] attributes = CustomAttributeExtensions.GetInheritedAttributes <TAttribute>(allAttributes, parameter.Name); return(attributes); }