派生しているのは、ValidateCountAttributeValidateNotNullAttributeValidateNotNullOrEmptyAttributeの3つです。派生しているのは、ValidateLengthAttributeValidatePatternAttributeValidateRangeAttributeValidateScriptAttributeValidateSetAttributeの5つです。して見ると、何となく違いが見えて来ないでしょうか。配列が渡された場合に、配列自体について(も)チェックするものは前者、配列の中身についてだけチェックするものは後者という使い分けで良さそうな気がします。系に共通の基底クラスがないことと、オーバーライドすべき適切なメソッドが見当たらないことから、自作は不可能と思われます。今回、2つの属性を作ってみます。ValidateNotEmptyStringAttribute文字列型の値が空文字列でないかどうかをチェックする属性です。ValidatePathAttributeパス文字列を取るパラメーターで、そのパスの実在性をチェックする属性です。ValidateNotEmptyStringAttribute文字列型の配列を受け取るコマンドを作ることを考えてみましょう。空文字列は受け入れたくないけれど、空の配列は構わないというケースは想定できます。コマンド内でループ処理するなら、空の配列は結局処理されないので、渡されないのと同じことです。つけてしまうと、コマンド側はいいのですが、呼び出し側が面倒です。配列が空かどうかを判別して、そのパラメーターを指定するかしないかで呼び分けなければいけません。これ↑を、こう↓したいわけです。いうのが何だか気持ち悪いので...。済ませるべきなんでしょうね...。系属性が自作できるということを示すことに意義がある記事ですので、良しとしましょう。