C # Отражение и атрибуты: ошибка?Я не могу обойти это - PullRequest
2 голосов
/ 30 декабря 2011

Это в консоли Immediate:

prop.GetCustomAttributes(typeof(RequiredParameterAttribute),true)

{BridgeStack.DataContracts.RequiredParameterAttribute [0]}

prop.GetCustomAttributes(typeof(RequiredParameterAttribute),true).Cast<RequiredParameterAttribute>()

{BridgeStack.DataContracts.RequiredParameterAttribute [0]} [BridgeStack.DataContracts.RequiredParameterAttribute []]: {BridgeStack.DataContracts.RequiredParameterAttribute [0]}

prop.GetCustomAttributes(typeof(RequiredParameterAttribute),true).Cast<RequiredParameterAttribute>().Any()

ложь

Я получаю те же результаты в приложении.

prop is Site in:

public class AnswerCollectionQuery : IPagedQuery, ISiteQuery, ISortableQuery, IOrderableQuery, IFilteredQuery
{
    public int? Page { get; set; }
    public int? PageSize { get; set; }
    public string Site { get; set; }

    [AllowedSortValues(QuerySortEnum.Activity, QuerySortEnum.Creation, QuerySortEnum.Votes)]
    public QuerySortEnum? Sort { get; set; }

    public object Min { get; set; }
    public object Max { get; set; }
    public DateTime? FromDate { get; set; }
    public DateTime? ToDate { get; set; }

    public QueryOrderEnum? Order { get; set; }

    public string Filter { get; set; }
}

Site в свою очередь происходит от ISiteQuery

public interface ISiteQuery : IQuery
{
    [RequiredParameter]
    string Site { get; set; }
}

Неудобная часть заключается в том, что консоль показывает атрибут, позволяет мне разыграть его, но я не могу получить его вообще, я получаю ноль в качестве длины перечисления, поэтому .Any() тоже терпит неудачу .FirstOrDefault() возвращает null, .First() броски и т. д.

Есть ли объяснения этому типу поведения?

PD: это работает, хотя я украшаю Site с [RequiredAttribute] в конкретном классе. Но я хотел сделать эту часть интерфейса.

Обновление для ясности :

prop исходит именно отсюда:

    public static IEnumerable<PropertyInfo> GetAllProperiesOfObject(object o)
    {
        const BindingFlags flags = BindingFlags.Public | BindingFlags.FlattenHierarchy | BindingFlags.Instance;
        PropertyInfo[] list = o.GetType().GetProperties(flags);

        return list;
    }

foreach (PropertyInfo prop in Utility.GetAllProperiesOfObject(entity))

Это тот случай, когда prop становится Site

1 Ответ

2 голосов
/ 30 декабря 2011

Ноль объясняется тем, что он возвращает типизированный массив нулевой длины, что означает: он не имеет атрибута.Вы также можете увидеть это с Attribute.IsDefined (который будет возвращать false).

При использовании неявной реализации интерфейса, открытое свойство класса не получает автоматически атрибуты от интерфейса, которому он удовлетворяет.Чтобы увидеть атрибуты интерфейса, вам необходимо использовать

typeof(ITheInterface).GetProperties()

Свойство Site в интерфейсе не связано со свойством Site в классе.Если свойство в классе должно иметь атрибуты: добавьте атрибуты явно.

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