从Object读取验证属性

时间:2012-10-12 08:32:44

标签: c# validation reflection

我有一个对象,其中包含使用Validation属性修饰的属性。我的验证工作正常,但我需要一个额外的方法来执行基于这些属性的字符串操作。

考虑以下对象:

public class Pupil
{
    /// <summary>
    /// 
    /// </summary>
    public Pupil()
    {

    }

    [NotNullValidator]
    [StringLengthValidator(0, 54, MessageTemplate = "Invalid value '{0}' for {1}, Max length: {5}")]
    public string Name{ get; set; }

    [NotNullValidator]
    [StringLengthValidator(0, 2, MessageTemplate = "Invalid value '{0}' for {1}, Max length: {5}")]
    public string Gender{ get; set; }
}

我希望能够根据StringLengthValidator属性及其参数来操作“Name”。例如:

///Takes a Pupil object in
public static void DoManipulation(object value)
    {
        foreach(var property in value.GetType().GetProperties())
        {
            if(property.Name == "Name")
            {
                var att = property.GetCustomAttributes(typeof(StringLengthValidator), false);
                var length = ((StringLengthValidator)att[0]).UpperBound;

            }               
        }
    }

“length”的值是null,而不是54.如何获取值? 希望这是有道理的,谢谢。

A

3 个答案:

答案 0 :(得分:1)

这适用于我,您是否获得了您认为属于的StringLengthValidator属性? (这是您的自定义类还是来自Enterprise Lib的那个?

就我而言,我创建了一个自定义类StringLengthValidator

enter image description here

答案 1 :(得分:0)

这一切背后的想法是价值54可以改变,对吧?否则你可以硬编码54。

看看如何使用标记在web.config中控制验证,以便将54添加到web.config并从应用程序中读取

Here就是一个例子,请寻找第一种方法Rule sets in Configuration

答案 2 :(得分:0)

当我今天和同事一起寻找它时,我们没有找到解决问题的合适方法,这就是下一个遇到麻烦的人的答案。

属性名称为StringLengthValidator,但是如果您检查类名称为StringLengthValidatorAttribute,则为了获取正确的属性,您需要调用函数GetCustomAttributes this方式:

property.GetCustomAttributes(typeof(StringLengthValidatorAttribute), false)

这将正确获取属性,然后您将能够获得UpperBound的值