2011-10-15 59 views
1

我正在構建一個方法來從System.ComponentModel.DataAnnotations中獲取DisplayAttribute以顯示屬性的標籤。建立一個使用lambda表達式的方法調用

[Display(Name="First Name")] 
public string FirstName { get; set; } 

的方法運作良好:

string GetDisplay(Type dataType, string property) 
{ 
    PropertyInfo propInfo = dataType.GetProperty(property); 
    DisplayAttribute attr = propInfo.GetCustomAttributes(false).OfType<DisplayAttribute>().FirstOrDefault(); 

    return (attr == null) ? propInfo.Name : attr.Name; 
} 

方法的調用可以是:

lblNome.Text = GetDisplay(typeof(Person), "FirstName") + ":"; 

我可以使用泛型使用一個更優雅的sintax,如:

string GetDisplay<T>(string property) 
{ 
    PropertyInfo propInfo = typeof(T).GetProperty(property); 
    DisplayAttribute attr = propInfo.GetCustomAttributes(false).OfType<DisplayAttribute>().FirstOrDefault(); 

    return (attr == null) ? propInfo.Name : attr.Name; 
} 

並致電:

GetDisplay<Person>("FirstName"); 

所以,我想用lambda表達式轉向這樣的呼籲,使之更更優雅:

GetDisplay<Person>(p => p.FirstName); 

的問題是我怎麼能做到這一點?

回答

2

這裏是我用來獲取由lambda表達式給出屬性名稱的方法:

public static string PropertyName<T1, T2>(this Expression<Func<T1, T2>> expression) 
    { 
     MemberExpression member = null; 
     if (expression.Body is MemberExpression) 
      member = expression.Body as MemberExpression; 
     if (expression.Body is UnaryExpression && expression.Body.NodeType == ExpressionType.Convert) 
      member = ((UnaryExpression)expression.Body).Operand as MemberExpression; 
     if (member == null) 
      throw new ArgumentException("Selector must point to a property or field.", "expression"); 
     return member.Member.Name; 
    } 

使用這種方法,你可以只調用以前的方法:

string GetDisplay<T>(Expression<Func<T, object>> expression) 
{ 
    return GetDisplay<T>(expression.PropertyName()); 
} 
+0

是的!謝謝! – iuristona