我正在创建一个小的验证框架,我有一个自定义Validation Attribute
,可以分配给IsValid
类中的方法和ValidationCore
属性。当IsValid
在方法内部调用时,ValidationCore
会找到调用方法并将其属性分配给方法。我的自定义Validation
属性具有名为TypeToValidate
的属性名称。因此,当我找到验证属性时,我会在该类型的类范围中查找任何类型。到目前为止我没有任何问题,但问题是当我想获得我要验证的属性值时,我没有任何该类的实例来获取该属性值。我不知道如何处理这种情况请帮助我。
这是我的样本:
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);
}
}
提前致谢。
答案 0 :(得分: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
属性中获取Validate
属性,那么 应该拥有该属性的实例,并且您可以直接转换为ValidateAttribute
并直接检索该属性。
基本上,目前尚不清楚属性在哪些方面真正进入了你想要做的事情。您的属性位于方法而不是属性上,并且您的属性未说明要验证的属性...
答案 1 :(得分:1)
您需要一个获取其属性值的实例。看起来您需要修改方法GetModelToValidateInClassScope
,以便它返回模型本身的实例以及PropertyInfo。
如果更改此方法,它看起来像这样(请注意新的 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);
...
}