Как я могу получить атрибуты свойств в C #? - PullRequest
2 голосов
/ 11 апреля 2011

Я пытаюсь реализовать простой API, где пользователь может диктовать сортировку свойств объекта с помощью атрибута свойства.

Что-то вроде:

[Sorting(SortOrder=0)]
public string Id { get; set; }

В базовом методе ToString () я затем использую отражение, чтобы извлечь свойства из объекта.

Type currentType = this.GetType();
PropertyInfo[] propertyInfoArray = currentType.GetProperties(BindingFlags.Public);
Array.Sort(propertyInfoArray, this.comparer);

Я написал собственный класс, использующий интерфейс IComparer для выполнения Array.Sort, но, оказавшись там, я застрял, пытаясь получить атрибут [Sorting]. У меня сейчас есть что-то похожее на это:

PropertyInfo xInfo = (PropertyInfo)x;
PropertyInfo yInfo = (PropertyInfo)y;

Я думал, что мог бы использовать xInfo.Attributes, но класс PropertyAttributes не делает то, что мне нужно. У кого-нибудь есть какое-нибудь руководство по получению этого атрибута [Сортировка]? Я много осматривался, но из-за того, что слово «Атрибут» в программировании перегружено, я постоянно получаю множество ложных выводов и тупиков.

Ответы [ 6 ]

3 голосов
/ 11 апреля 2011

Использование MemberInfo.GetCustomAttributes

System.Reflection.MemberInfo info = typeof(Student).GetMembers()
                                                   .First(p => p.Name== "Id");
object[] attributes = info.GetCustomAttributes(true);

Редактировать:

Чтобы получить само значение, посмотрите на этот ответ .

Удачи!

2 голосов
/ 11 апреля 2011

Попробуйте это:

System.Reflection.MemberInfo info = typeof(MyClass);
object[] attributes = info.GetCustomAttributes(true);
1 голос
/ 11 апреля 2011

Я обычно использую набор методов расширения для этого:

public TAttribute GetAttribute<TAttribute>(this ICustomAttributeProvider provider, bool inherit = false)
  where TAttribute : Attribute
{
  return GetAttributes<TAttribute>(provider, inherit).FirstOrDefault();
}

public IEnumerable<TAttribute> GetAttributes<TAttribute>(this ICustomAttributeProvider provider, bool inherit = false)
  where TAttribute : Attribute
{
  return provider.GetCustomAttributes(typeof(TAttribute), inherit).Cast<TAttribute>()
}

Я могу назвать его так:

var attrib = prop.GetAttribute<SortingAttribute>(false);

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

1 голос
/ 11 апреля 2011

GetCustomAttributes - это метод, который вы хотите использовать.

SortingAttribute[] xAttributes = (SortingAttribute[])xInfo.GetCustomAttributes(typeof(SortingAttribute), true);
0 голосов
/ 11 апреля 2011

Вы должны быть в состоянии получить атрибут, используя MemberInfo.GetCustomAttributes в экземпляре PropertyInfo.

0 голосов
/ 11 апреля 2011

Вам необходимо использовать метод GetCustomAttributes.

...