NotAttribute
MVC3プロジェクトのバリデーター属性を書き込もうとしています。私はそれをこのように使いたい:
[Not("00000000-0000-0000-0000-000000000000", typeof(Guid), ErrorMessage = "You must select a valid id.")]
public Guid ObjectId { get; set; }
NotAttribute
ここで、をに結び付けたくありませんGuid
が、オブジェクトは文字列から解析可能である必要があります。最初にメソッドを探しTryParse
、次にメソッドを探しますParse
。両方が失敗し、タイプがまだ文字列でない場合は、エラーをスローします。これまでのところ、とても良いです、合併症はありません。
私のクラスは次のようになります。
public class NotAttribute : ValidationAttribute, IClientValidatable
{
public Type PropertyType { get; set; }
public string NotEqualTo { get; private set; }
public bool IgnoreWhitespace { get; set; }
public bool CaseInsensitive { get; set; }
public NotAttribute(string notEqualTo)
{
NotEqualTo = notEqualTo;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (PropertyType == null) PropertyType = typeof(string);
if (PropertyType == typeof(string))
{
//this is the easy case. We can compare easy enough
var leftSide = value.ToStringOrEmpty();
var rightSide = NotEqualTo ?? string.Empty;
if (IgnoreWhitespace)
{
leftSide = leftSide.Trim();
rightSide = rightSide.Trim();
}
if (CaseInsensitive)
{
leftSide = leftSide.ToUpperInvariant();
rightSide = rightSide.ToUpperInvariant();
}
if (leftSide != rightSide) return null; // all is well
}
var tryParseMethod = PropertyType.GetMethod("TryParse",
Reflection.BindingFlags.Static | Reflection.BindingFlags.Public, null,
new Type[] {typeof(string), PropertyType.MakeByRefType()}, null);
//This is where I get lost
return base.IsValid(value, validationContext);
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
throw new NotImplementedException();
}
}
理論的に呼び出すことができるオブジェクトメソッドへの参照を返すことは間違いありませtryParseMethod
んが、ここで問題が発生します。
実行時に決定されたタイプを渡して、どのように呼び出すのですか?これはジェネリックスの実装を叫んでいるようですが、ここにそれを注入できる場所がわかりません。また、「not」値と比較する必要のある値を取得したら、実行時に何らかの方法でキャストする必要があります。これもジェネリックスを求めて叫びます。
どうすればこれを機能させることができますか?私はこれを完全に間違った方法で行っていますか?