Не удается получить атрибут из PropertyInfo C#

У меня есть класс и интерфейс, настроенный так:

public partial interface INav_Item 
{
        [FieldID("df918977-369c-4a06-ac38-adb8741b5f75")]
        string Title  {get; set;}
}


public partial class Nav_Item  : INav_Item 
{
        [FieldID("df918977-369c-4a06-ac38-adb8741b5f75")]
        public virtual string Title  {get; set;}
}

И тогда я унаследовал этот класс:

public class MenuItem : Nav_Item
{
        public virtual IEnumerable<MenuItem> Children { get; set; }

        //some other properties
}

Я сейчас пытаюсь создать экземпляр объекта типа MenuItemи пытается получить атрибуты из класса Inherited (не могу создать экземпляр MenuItem напрямую, потому что тип передается из других классов)

object obj = Activator.CreateInstance(type);

foreach (PropertyInfo propInfo in type.GetProperties())
{
            FieldAttribute sfi =(FieldAttribute)propInfo.PropertyType.GetCustomAttribute(typeof(FieldAttribute));

}

Но это дает мне sfi быть null, Я также отладил, чтобы попытаться получить все атрибуты:

propInfo.PropertyType.GetCustomAttributes()

... но это только дает мне системные атрибуты (тип и что-то еще), но моих собственных атрибутов просто нет? Это потому, что класс наследуется? Как я могу получить значение атрибута?

РЕДАКТИРОВАТЬ:

Класс атрибута определяется так:

public class FieldIDAttribute : Attribute
{
    private string _id;

    public FieldAttribute(string Id)
    {
        _id = Id;
    }

    public ID TheFieldID
    {
        get
        {
            return new ID(_id);
        }
    }
}

2 ответа

Решение

Нет, это не проблема наследования. Вам нужно изменить это:

FieldAttribute sfi =(FieldAttribute)propInfo.PropertyType
    .GetCustomAttribute(typeof(FieldAttribute));

к этому:

var sfi = propInfo.GetCustomAttribute(typeof(FieldIDAttribute)) as FieldIDAttribute;

Это потому что PropertyType возвращает тип свойства, т.е. string в твоем случае. И тип string не имеет вашего собственного атрибута.

Также ваше редактирование FieldIDAttribute класс не правильный. Его конструктор не соответствует имени класса и имеет необъявленный и неправильный ID тип.

В дополнение к тому, что сказал Алекс, вы должны указать флаги привязки, это работает для меня:

foreach (PropertyInfo propInfo in type.GetProperties(BindingFlags.Instance | BindingFlags.Public))
{
            FieldIDAttribute sfi = propInfo.PropertyType.GetCustomAttribute(typeof(FieldIDAttribute)) as FieldIDAttribute;

            //Check if null here, if not, it has the attribute.

}

Изменить: "тип" должен быть Nav_Item, у вас нет FieldIDAttribute применяется к чему-либо в классе Menu_item. Для того чтобы получить атрибуты IEnumerable, вам нужно будет пройти через него и прочитать свойства каждого типа элемента в списке.

Другие вопросы по тегам