У меня есть тип, 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
}
}
Как я могу улучшить это? Мои извинения, если это - дубликат, существуют тонна отражательных потоков там... кажется, что это - вполне горячая тема.
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] ()
.
лучший способ:
//if (attributes.Length == 1)
if (attributes.Length != 0)
Насколько мне известно, нет лучшего способа более разумной работы с библиотекой 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'
Я считаю, что это поможет вам структурировать код в более удобочитаемом виде.
Если вы регулярно имеете дело с атрибутами в отражении, очень и очень практично определить некоторые методы расширения. Вы увидите это во многих проектах. Вот тот, который у меня часто бывает:
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>()
Всегда есть LINQ:
t.GetProperties().Where(
p=>p.GetCustomAttributes(typeof(MyAttribute), true).Length != 0)