我有一个类型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
}
}
我该如何改进呢?如果这是一个副本,我很抱歉,有大量的反射线程在那里…看起来这是个很热门的话题。
如果您经常在Reflection中处理attribute,那么定义一些扩展方法是非常非常实用的。您将在许多项目中看到这一点。这个是我经常用的:
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<BarAttribute>();
其他项目(例如StructureMap)拥有成熟的ReflectionHelper类,这些类使用表达式树具有良好的语法来标识例如PropertyInfos。使用量是这样的:
ReflectionHelper.GetProperty<Foo>(x => x.MyProperty).HasAttribute<BarAttribute>()
如果您经常在Reflection中处理attribute,那么定义一些扩展方法是非常非常实用的。您将在许多项目中看到这一点。这个是我经常用的:
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<BarAttribute>();
其他项目(例如StructureMap)拥有成熟的ReflectionHelper类,这些类使用表达式树具有良好的语法来标识例如PropertyInfos。使用量是这样的:
ReflectionHelper.GetProperty<Foo>(x => x.MyProperty).HasAttribute<BarAttribute>()