Как получить свойства с пользовательскими атрибутами, используя TypeDescriptor.GetProperties в атрибуте класса? - PullRequest
0 голосов
/ 30 марта 2012

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

Это для атрибута класса, поэтому я хочу получить свойства в классе, которые имеют пользовательский атрибут.

Что у меня до сих пор

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public class AtLeastOneValueRequiredClassAttribute : ValidationAttribute
{
    public override bool IsValid(object selection)
    {
        var att = new Attribute[] { new AtLeastOneValueRequiredAttribute() };

        PropertyDescriptorCollection properties = 
            TypeDescriptor.GetProperties(selection, att);

        foreach (var property in properties)
        {
            if (property != null)
                return true;
        }
        return false;
    }

... всегда возвращает ВСЕ свойства, а не только те, которые имеют мой собственный атрибут свойства (AtLeastOneValueRequiredAttribute).

Вот класс, к которому я применяю это:

[AtLeastOneValueRequiredClassAttribute(ErrorMessage = "You must enter at least one number")]
public class MemberDetails
{
    [AtLeastOneValueRequired]
    [Display(Name = "Home Phone Number")]
    [RegularExpression("([0-9]+)", ErrorMessage = "Please provide a valid Home Phone number")]
    public string HomePhoneNumber { get; set; }

    [AtLeastOneValueRequired]
    [Display(Name = "Work Phone Number")]
    [RegularExpression("([0-9]+)", ErrorMessage = "Please provide a valid Work Phone number")]
    public string WorkPhoneNumber { get; set; }

    [AtLeastOneValueRequired]
    [Display(Name = "Fax Number")]
    [RegularExpression("([0-9]+)", ErrorMessage = "Please provide a valid Fax number")]
    public string FaxNumber { get; set; }

    [AtLeastOneValueRequired]
    [Display(Name = "Mobile Number")]
    [RegularExpression("([0-9]+)", ErrorMessage = "Please provide a valid Mobile Phone number")]
    public string MobileNumber { get; set; }
}        
...