0

NotAttributeMVC3プロジェクトのバリデーター属性を書き込もうとしています。私はそれをこのように使いたい:

[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」値と比較する必要のある値を取得したら、実行時に何らかの方法でキャストする必要があります。これもジェネリックスを求めて叫びます。

どうすればこれを機能させることができますか?私はこれを完全に間違った方法で行っていますか?

4

1 に答える 1

1

これは静的メソッドなので、呼び出すタイプのクラスのインスタンスを必要とせずに呼び出すことができるはずですPropertyType( MSDN ページを参照してください)。だから、あなたはただ電話InvokeをかけることができますtryParseMethod

ただし、メソッド自体はパラメーターとしてTryParse型のクラスのインスタンスを必要とするため、そのために使用する必要があります。PropertyTypeoutSystem.Activator.CreateInstance()

だから、おそらく次のようなもの

var parsedObject = System.Activator.CreateInstance(PropertyType);
bool parseSuceeded = tryParseMethod.Invoke(null, new [] { value, parsedObject });

仕事をします。

于 2012-06-26T05:29:21.850 に答える