检查属性是否有属性

给定一个类中的属性和属性 – 确定它是否包含给定属性的最快方法是什么? 例如:

[IsNotNullable] [IsPK] [IsIdentity] [SequenceNameAttribute("Id")] public Int32 Id { get { return _Id; } set { _Id = value; } } 

什么是最快的方法来确定,例如它有“IsIdentity”属性?

没有快速的方法来检索属性。 但代码应该是这样的(信贷给Aaronaught ):

 var t = typeof(YourClass); var pi = t.GetProperty("Id"); var hasIsIdentity = Attribute.IsDefined(pi, typeof(IsIdentity)); 

如果你需要检索属性属性然后

 var t = typeof(YourClass); var pi = t.GetProperty("Id"); var attr = (IsIdentity[])pi.GetCustomAttributes(typeof(IsIdentity), false); if (attr.Length > 0) { // Use attr[0], you'll need foreach on attr if MultiUse is true } 

如果您正在使用.NET 3.5,则可以尝试使用expression式树。 它比反思更安全:

 class CustomAttribute : Attribute { } class Program { [Custom] public int Id { get; set; } static void Main() { Expression<Func<Program, int>> expression = p => p.Id; var memberExpression = (MemberExpression)expression.Body; bool hasCustomAttribute = memberExpression .Member .GetCustomAttributes(typeof(CustomAttribute), false).Length > 0; } } 

您可以使用通用(通用)方法来读取给定MemberInfo上的属性

 public static bool TryGetAttribute<T>(MemberInfo memberInfo, out T customAttribute) where T: Attribute { var attributes = memberInfo.GetCustomAttributes(typeof(T), false).FirstOrDefault(); if (attributes == null) { customAttribute = null; return false; } customAttribute = (T)attributes; return true; } 

如果你正在试图在便携式类库PCL(像我这样),那么这里是如何做到这一点:)

 public class Foo { public string A {get;set;} [Special] public string B {get;set;} } var type = typeof(Foo); var specialProperties = type.GetRuntimeProperties() .Where(pi => pi.PropertyType == typeof (string) && pi.GetCustomAttributes<Special>(true).Any()); 

如果您需要的话,您可以检查具有此特殊属性的属性数量。

要通过@Hans Passant更新和/或增强答案,我将把该属性的检索分解为一个扩展方法。 这有一个额外的好处,就是在方法GetProperty()中去掉令人讨厌的魔法string

 public static class PropertyHelper<T> { public static PropertyInfo GetProperty<TValue>( Expression<Func<T, TValue>> selector) { Expression body = selector; if (body is LambdaExpression) { body = ((LambdaExpression)body).Body; } switch (body.NodeType) { case ExpressionType.MemberAccess: return (PropertyInfo)((MemberExpression)body).Member; default: throw new InvalidOperationException(); } } } 

您的testing然后减less到两条线

 var property = PropertyHelper<MyClass>.GetProperty(x => x.MyProperty); Attribute.IsDefined(property, typeof(MyPropertyAttribute)); 

这是一个相当古老的问题,但我用过

我的方法有这个参数,但它可以build立:

 Expression<Func<TModel, TValue>> expression 

那么在这个方法中:

 System.Linq.Expressions.MemberExpression memberExpression = expression.Body as System.Linq.Expressions.MemberExpression; Boolean hasIdentityAttr = System.Attribute .IsDefined(memberExpression.Member, typeof(IsIdentity));