3

私は小さな検証フレームワークを作成しています。クラス内のメソッドとプロパティにValidation Attribute割り当てることができるカスタムがあります。メソッド内で呼び出されると、呼び出し元のメソッドが見つかり、その属性がメソッドに割り当てられます。私のカスタム属性には、という名前のプロパティ名があります。したがって、検証属性を見つけると、そのタイプのクラススコープで任意のタイプを探します。今まで問題はありませんでしたが、問題は、検証する必要のあるプロパティの値を取得したいときに、そのプロパティ値を取得するためのそのクラスのインスタンスがないことです。この状況にどう対処できるかわかりません。助けてください。IsValidValidationCoreIsValidValidationCoreValidationTypeToValidate

これは私のサンプルです:

public class TestClass
{
    public static TestModel Model { get; set; }
    public static ModelValidator ModelState
    {
        get { return new ModelValidator(); }
    }

    [Validate(typeof(TestModel))]
    public static void DoSomething()
    {
        if (ModelState.IsValid)
        {
            // Do something else....
        }
    }
}

編集:これは私のIsValid財産です

    public virtual Boolean IsValid
    {
        get
        {
            // Get IsValid caller method
            var method = GetCallerMethod();

            // Get method attribute
            var Attrib = GetMethodAttribute(typeof(ValidateAttribute), method);

            // Get model to validate inside class scope
            var modelProperty = GetModelToValidateInClassScope(Attrib, method);

            if (modelProperty != null)
            {
                ValidateModel(modelProperty);
            }

            ....
        }
    }

そしてここにValidateModel方法があります:

    protected virtual void ValidateModel(PropertyInfo modelProperty)
    {
        // Here I've model property
        // But I can't get its value
        var model = modelProperty.GetValue(null, null);
        var properties = model.GetType().GetProperties(
                        BindingFlags.FlattenHierarchy |
                        BindingFlags.Public |
                        BindingFlags.Instance |
                        BindingFlags.DeclaredOnly);


        foreach (var propertyInfo in properties)
        {
            // Add error to error list
            GetPropertyErrors(model, propertyInfo);
        }
    }

前もって感謝します。

4

2 に答える 2

1

実際に聞かれた質問への回答

今まで問題はありませんでしたが、問題は、検証する必要があるプロパティの値を取得したいときに、そのプロパティ値を取得するためのそのクラスのインスタンスがありません。

それが静的プロパティであれば問題ありません -null最初の引数として使用するだけです:

// First argument is the instance: null as it's a static property
// Second argument is indexer arguments: null as we don't have any
var value = property.GetValue(null, null);

ドキュメントから:

静的プロパティは個々のオブジェクトではなく型に属しているため、オブジェクト引数として null を渡して静的プロパティを取得します。

代替アプローチ

属性TypeToValidateからプロパティを取得しようとしているだけの場合は、属性のインスタンスが必要であり、プロパティにキャストして直接取得できます。ValidateValidateAttribute

基本的に、プロパティが実際に何をしようとしているのかは明確ではありません。属性はプロパティではなくメソッドにあり、属性は検証するプロパティを示していません...

于 2012-07-14T09:50:42.533 に答える
1

プロパティ値を取得するインスタンスが必要です。GetModelToValidateInClassScopePropertyInfo と共にモデル自体のインスタンスを返すようにメソッドを変更する必要があるようです。

このメソッドが次のように変更された場合 (新しいoutパラメータに注意してください):

PropertyInfo GetModelToValidateInClassScope(Type attributeType, MethodInfo methodInfo, out object instance)
{
   // same implementation as before ...

   // assign the model to use, 
   // which is likely accessible from somewhere in the is method
   instance = theModelInstanceFromThisMethod;

   // .. or if the property is static, then uncomment the next line:
   // instance = null;

   // same return value as before ...
}

このメソッドの実装を提供していないため、ここでは推測しています。モデル インスタンスにアクセスできない場合GetModelToValidateInClassScopeは、別の場所から取得する必要があります。

モデル インスタンスを取得したら、次のように使用できます。ValidateModelモデル インスタンスを最初のパラメーターとして受け入れるように変更されていることに注意してください。

...   

    // Get model to validate inside class scope 
    object instance;  // <--- will hold the model instance
    var modelProperty = GetModelToValidateInClassScope(Attrib, method, out instance); 

    if (modelProperty != null) 
    { 
        ValidateModel(instance, modelProperty); // <--- make sure to pass the instance along!
    } 

...

protected virtual void ValidateModel(object instance, PropertyInfo modelProperty)         
{         
    // get value of instance property
    var model = modelProperty.GetValue(instance, null);    

    ...

}     
于 2012-07-14T21:08:41.013 に答える