यहाँ कुछ स्थैतिक विधियाँ हैं जिनका उपयोग आप MaxLength, या किसी अन्य विशेषता को प्राप्त करने के लिए कर सकते हैं।
using System;
using System.Linq;
using System.Reflection;
using System.ComponentModel.DataAnnotations;
using System.Linq.Expressions;
public static class AttributeHelpers {
public static Int32 GetMaxLength<T>(Expression<Func<T,string>> propertyExpression) {
return GetPropertyAttributeValue<T,string,MaxLengthAttribute,Int32>(propertyExpression,attr => attr.Length);
}
//Optional Extension method
public static Int32 GetMaxLength<T>(this T instance,Expression<Func<T,string>> propertyExpression) {
return GetMaxLength<T>(propertyExpression);
}
//Required generic method to get any property attribute from any class
public static TValue GetPropertyAttributeValue<T, TOut, TAttribute, TValue>(Expression<Func<T,TOut>> propertyExpression,Func<TAttribute,TValue> valueSelector) where TAttribute : Attribute {
var expression = (MemberExpression)propertyExpression.Body;
var propertyInfo = (PropertyInfo)expression.Member;
var attr = propertyInfo.GetCustomAttributes(typeof(TAttribute),true).FirstOrDefault() as TAttribute;
if (attr==null) {
throw new MissingMemberException(typeof(T).Name+"."+propertyInfo.Name,typeof(TAttribute).Name);
}
return valueSelector(attr);
}
}
स्थैतिक विधि का उपयोग ...
var length = AttributeHelpers.GetMaxLength<Player>(x => x.PlayerName);
या एक उदाहरण पर वैकल्पिक विस्तार विधि का उपयोग कर ...
var player = new Player();
var length = player.GetMaxLength(x => x.PlayerName);
या किसी अन्य विशेषता के लिए पूर्ण स्थैतिक विधि का उपयोग करना (उदाहरण के लिए StringLength) ...
var length = AttributeHelpers.GetPropertyAttributeValue<Player,string,StringLengthAttribute,Int32>(prop => prop.PlayerName,attr => attr.MaximumLength);
मिकेल एंगवर के जवाब से प्रेरित।