Как получить список свойств с данным атрибутом?

У меня есть тип, t, и я хотел бы получить список общественных собственностей, которые имеют атрибут MyAttribute. Атрибут отмечен с AllowMultiple = false, как это:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]

В настоящее время то, что я имею, является этим, но я думаю, что существует лучший путь:

foreach (PropertyInfo prop in t.GetProperties())
{
    object[] attributes = prop.GetCustomAttributes(typeof(MyAttribute), true);
    if (attributes.Length == 1)
    {
         //Property with my custom attribute
    }
}

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

201
задан abatishchev 5 June 2012 в 20:41
поделиться

5 ответов

SOLVED

После небольшого экспериментирования я обнаружил, что массив _ multisort отлично выполняет трюк:

$tag = array(); 
$num = array();

foreach($arrTags as $key => $value){ 
$tag[] = $key; 
$num[] = $value; 
}

array_multisort($num, SORT_DESC, $tag, SORT_ASC, $arrTags);

:)

-121--2102894-

Пытались ли вы использовать TaureLayoutPanel? Это очень полезно для размещения элементов управления в ячейках.

-121--3404253-
var props = t.GetProperties().Where(
                prop => Attribute.IsDefined(prop, typeof(MyAttribute)));

Это позволяет избежать необходимости материализации любых экземпляров атрибутов (т.е. дешевле, чем GetCustomAttribute [s] () .

371
ответ дан 23 November 2019 в 05:02
поделиться

лучший способ:

//if (attributes.Length == 1)
if (attributes.Length != 0)
-4
ответ дан 29 July 2019 в 06:16
поделиться

Насколько мне известно, нет лучшего способа более разумной работы с библиотекой Reflection. Однако вы можете использовать LINQ, чтобы сделать код немного лучше:

var props = from p in t.GetProperties()
            let attrs = p.GetCustomAttributes(typeof(MyAttribute), true)
            where attrs.Length != 0 select p;

// Do something with the properties in 'props'

Я считаю, что это поможет вам структурировать код в более удобочитаемом виде.

33
ответ дан 23 November 2019 в 05:02
поделиться

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

public static bool HasAttribute<T>(this ICustomAttributeProvider provider) where T : Attribute
{
  var atts = provider.GetCustomAttributes(typeof(T), true);
  return atts.Length > 0;
}

, который можно использовать как typeof (Foo) .HasAttribute ();

В других проектах (например, StructureMap) есть полноценные классы ReflectionHelper, использующие Expression деревья, чтобы иметь прекрасный синтаксис для идентификации, например PropertyInfos. Тогда использование выглядит следующим образом:

ReflectionHelper.GetProperty<Foo>(x => x.MyProperty).HasAttribute<BarAttribute>()
6
ответ дан 23 November 2019 в 05:02
поделиться

Всегда есть LINQ:

t.GetProperties().Where(
    p=>p.GetCustomAttributes(typeof(MyAttribute), true).Length != 0)
13
ответ дан 23 November 2019 в 05:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: