読者です 読者をやめる 読者になる 読者になる

Microsoft Enterprise Library Validation Application Block

C#

最近、カスタム属性を使って、メンバフィールドのバリデーションができないかなーと考えてました。

例えば、こんなカスタム属性を作って、

class ValidatorAttribute : Attribute
{
    public Func<int, bool> Validate
    {
        get;
        private set;
    }

    public ValidatorAttribute(Func<int, bool> val)
    {
        Validate = val;
    }
}


こんな風に条件を書ければいいなと思っていたのですが、

    [Validator(x => x > 0 && x < 50)]
    public int Parameter { get; set; }

カスタム属性の引数にはデリゲートやラムダ式は使えないため、上記のコードはエラーになってしまいます。


んで、どうしたもんかなぁと考えていたら、たまたま読んでいた本の脚注で、Microsoft Enterprise Library Validation Application Blockなるものの存在を知りました。

ThoughtWorksアンソロジー ―アジャイルとオブジェクト指向によるソフトウェアイノベーション

ThoughtWorksアンソロジー ―アジャイルとオブジェクト指向によるソフトウェアイノベーション

Enterprise Libraryというのは、DIコンテナ、ロギング、キャッシュなど、エンタープライズ系のアプリケーションで汎用的に使える機能を集めたライブラリ群だそうです。ライセンスはMs-PLなので使いやすいですね。

この中にValidationのライブラリも含まれています。

こいつを利用すると、文字列の長さや数値の範囲などを制限することができるようになります。

以下の例では、名前と年齢が範囲に入っていないと教えてくれます。

using System;
using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;

class Program
{
    // 名前の長さは1〜30文字まで
    [StringLengthValidator(1,30)]
    public string Name { get; set; }

    // 年齢は150歳まで
    [RangeValidator(0, RangeBoundaryType.Inclusive, 150, RangeBoundaryType.Inclusive)]
    public int Age { get; set; }

    static void Main(string[] args)
    {
        var p = new Program()
        {
            Name = "寿限無寿限無五劫の擦り切れ海砂利水魚の水行末雲来末風来末食う寝る処に住む処やぶら小路の藪柑子パイポパイポパイポのシューリンガンシューリンガンのグーリンダイグーリンダイのポンポコピーのポンポコナーの長久命の長助",
            Age = 120000000
        };

        var results = Validation.Validate(p);
        if (!results.IsValid)
        {
            foreach (var result in results)
            {
                Console.WriteLine(result.Message);
            }
        }
    }
}

他にも正規表現で文字列をチェックできたり、カスタムバリデータを作ったりすることもできるみたいですね。