2013-07-10 65 views
1

我想編寫一個擴展方法來獲取StringLength屬性上MaximumLength屬性的值。獲取StringLength值的擴展方法

例如,我有一個類:

public class Person 
{ 
    [StringLength(MaximumLength=1000)] 
    public string Name { get; set; } 
} 

我希望能夠做到這一點:

Person person = new Person(); 
int maxLength = person.Name.GetMaxLength(); 

會使用某種反思的可能呢?

+3

我想你也許可以做一個LINQ表達的東西用類似用法:'INT最大長度=海峽ingLength.Get(()=> person.Name);'編輯:這是我正在談論的基本概念;不同的用法,但想法是傳遞一個lambda表達式並利用LINQ'Expression'對象來檢查引用的屬性並檢索它的屬性:http://stackoverflow.com/questions/671968/retrieving-property-name-from -lambda-expression –

回答

4

如果使用LINQ表達式,可以通過反射拉出信息略有不同的語法(和你能避免定義上常用string類型的擴展方法):

public class StringLength : Attribute 
{ 
    public int MaximumLength; 

    public static int Get<TProperty>(Expression<Func<TProperty>> propertyLambda) 
    { 
     MemberExpression member = propertyLambda.Body as MemberExpression; 
     if (member == null) 
      throw new ArgumentException(string.Format(
       "Expression '{0}' refers to a method, not a property.", 
       propertyLambda.ToString())); 

     PropertyInfo propInfo = member.Member as PropertyInfo; 
     if (propInfo == null) 
      throw new ArgumentException(string.Format(
       "Expression '{0}' refers to a field, not a property.", 
       propertyLambda.ToString())); 

     var stringLengthAttributes = propInfo.GetCustomAttributes(typeof(StringLength), true); 
     if (stringLengthAttributes.Length > 0) 
      return ((StringLength)stringLengthAttributes[0]).MaximumLength; 

     return -1; 
    } 
} 

所以你Person類可能是:

public class Person 
{ 
    [StringLength(MaximumLength=1000)] 
    public string Name { get; set; } 

    public string OtherName { get; set; } 
} 

您的使用情況可能是這樣的:

Person person = new Person(); 

int maxLength = StringLength.Get(() => person.Name); 
Console.WriteLine(maxLength); //1000 

maxLength = StringLength.Get(() => person.OtherName); 
Console.WriteLine(maxLength); //-1 

對於沒有定義該屬性的屬性,您可以返回-1以外的內容。你並不具體,但很容易改變。

+0

謝謝隊友 - 我認爲這是一個很好的方法。太糟糕了,我不能使用擴展方法,但哦。 – Andrew

0

這可能不是這樣做的最好的方式,但如果你不介意suppling屬性名,你需要得到的屬性值,你可以使用類似

public static class StringExtensions 
{ 
    public static int GetMaxLength<T>(this T obj, string propertyName) where T : class 
    { 
     if (obj != null) 
     { 
      var attrib = (StringLengthAttribute)obj.GetType().GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance) 
        .GetCustomAttribute(typeof(StringLengthAttribute), false); 
      if (attrib != null) 
      { 
       return attrib.MaximumLength; 
      } 
     } 
     return -1; 
    } 
} 

用法:

Person person = new Person(); 
int maxLength = person.GetMaxLength("Name"); 

否則使用他的評論中提到的像克里斯·辛克萊的功能會很好地工作