2009年2月18日水曜日

DataAnnotationsのValidationAttributeを作る

何となくね、n以上の値のみ許可、っていうValidationAttributeが欲しいな、と思ったわけですよ。 でも、実際はRangeで最小値とdouble.MaxValue(intでもいいけど)とかで、代用出来るじゃないですか。 悩ましいけど、コードを見てコレってようは最小値を制限したいってことなんでしょ?っていうのをすぐ分かるようにしとくなら専用のValidationAttributeかなって思ってね。

で、思ったわけ。そもそもなんて言う名前のクラスにすれば適切なんですか、って。 辞書で調べたらor moreとか、aboveとか出てくるじゃない。でもなんかね~、クラス名にするにはしっくり来ない。

みんなどうしてるんだろ。気になる。結局はさ古典(昔、なんかで勉強したときに確かGTEとかって書いた気がするし)に則って、GreaterThanOrEqualAttributeって名前にしたんだけどさ。長いよね。ちなみにLINQのExpression Treeではどうしてるのかな、とMSDN見てみたら(ExpressionType 列挙体 (System.Linq.Expressions))、ExpressionType.GreaterThanOrEqualだね。じゃ、そういうことで。

   

public class GreaterThanOrEqualAttribute : ValidationAttribute { private Type targetType { get; set; } private object minValue { get; set; }

public GreaterThanOrEqualAttribute(Type type, object min) { targetType = type; minValue = min; }

public override bool IsValid(object value) { if (value == null) return false;

var val = Convert.ChangeType(value, targetType) as IComparable; var min = Convert.ChangeType(minValue, targetType) as IComparable; // 同値以上ならOK return val.CompareTo(min) > 0; } }

って、書いて動くんだけど、まぁ、ちょっと、ね。

最初から用意されてないってことはRange使えよっていう意図があるような気がするから、Range使いましょう。