Не удается получить атрибут из 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, вам нужно будет пройти через него и прочитать свойства каждого типа элемента в списке.