2013-05-22 29 views
2

假設我有這個類:獲取對象屬性爲字符串在C#中使用Lambda表達式

class MyClass { 
    public int MyProperty { get; set; } 
} 

而且我想要得到的myProperty的作爲字符串(如「myProperty的」),但通過lambda表達式或其他任何方式是「重構友好」的。

是否有語法是這樣的:

void BindToDataSource(IEnumerable<MyClass> list) { 
    myComboBox.DataSource = list; 
    myComboBox.DisplayMember = typeof(MyClass).GetPropertyToString(c => c.MyProperty); 
} 

我不想要這樣的代碼:

myComboBox.DisplayMember = "MyProperty" 

,因爲它不是「重構友好」。

+0

所以你想使用反射來避免使用反射?沒有編譯時反射:http://blogs.msdn.com/b/ericlippert/archive/2009/05/21/in-foof-we-trust-a-dialogue.aspx –

+0

我不介意如果它使用反射,我只想讓我的代碼「重構友好」。 – rajeemcariazo

+0

[C#中的編譯時反射]的可能的重複(http://stackoverflow.com/questions/9335126/compile-time-reflection-in-c-sharp) –

回答

6

看看這個問題的答案:Workaround for lack of 'nameof' operator in C# for type-safe databinding?

在你的情況,如果實施該泛型類:

public class Nameof<T> 
{ 
    public static string Property<TProp>(Expression<Func<T, TProp>> expression) 
    { 
     var body = expression.Body as MemberExpression; 

     if(body == null) 
      throw new ArgumentException("'expression' should be a member expression"); 

     return body.Member.Name; 
    } 
} 

您可以使用它像這樣:

void BindToDataSource(IEnumerable<MyClass> list) 
{ 
    myComboBox.DataSource = list; 
    myComboBox.DisplayMember = Nameof<MyClass>.Property(e => e.MyProperty); 
} 
相關問題