检查属性是否有属性
给定一个类中的属性和属性 – 确定它是否包含给定属性的最快方法是什么? 例如:
[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));