Как рекурсивно найти атрибуты дочерних свойств - PullRequest
2 голосов
/ 09 января 2012

У меня есть атрибут для проверки, называемый Required() : BaseAttribute, и я могу отслеживать его, используя следующий код: (BaseAttribute просто реализует метод IsValid ().)

public static String Validate(object Object)
{
    StringBuilder builder = new StringBuilder();
    if (Object != null)
    {
        Type ObjectType = Object.GetType();
        PropertyInfo[] Properties = ObjectType.GetProperties();
        foreach (PropertyInfo Property in Properties)
        {
            object[] Attributes = Property.GetCustomAttributes(typeof(BaseAttribute), true);
            foreach (object Attribute in Attributes)
                builder.AppendLine(((BaseAttribute)Attribute).IsValid(Property, Object));
        }
    }
return builder.ToString();
}

Проблема в том, чтоработает:

class roh {
    [Required()]
    public string dah { get; set; }
}

class main {
    Console.WriteLine(Validate(new roh()));
}

, но это не так:

class fus {
    private roh _roh
    public roh Roh {
        get { if (_roh == null)
                  _roh = new roh;
              return _roh; }
        set { _roh = value; }
    }
}

class roh {
    [Required()]
    public string Dah { get; set; }
}

class main {
    Console.WriteLine(Validate(new fus()));
}

Как я могу изменить мой метод Validate, чтобы он мог рекурсивно находить пользовательские атрибуты независимо от глубины объекта?

Ответы [ 2 ]

2 голосов
/ 09 января 2012

Вы можете использовать Microsoft Enterprise Library . Он имеет некоторые встроенные блоки валидации (по стилю похожему на то, что вы используете здесь) и поддерживает рекурсивную валидацию объектов по графу объектов, я считаю.

Вы ссылаетесь на DLL-файл проверки EntLib и можете использовать встроенную проверку или написать свою собственную. Затем вы можете проверить его с помощью простого Validation.Validate(myObject) вызова.

Надеюсь, что это может помочь:)

1 голос
/ 09 января 2012

Вы уже сказали волшебное слово - рекурсия. Для каждого свойства, которое вы посещаете, вызывайте Validate для объекта, который оно хранит, и вуаля.

Одно предостережение - бесконечная рекурсия - это будет работать нормально, если ваш граф объектов является деревом. Если он более сложный, вам нужно отследить, какие объекты вы уже посетили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...