2014-02-19 22 views
2

我有一類包含4個屬性:如何在運行時創建的表達

class MyClass 
{ 
    public int i{get;set;} 
    public double d{get;set;} 
    public string s{get;set;} 
    public char c{get;set;} 
} 

這個類的列表:

var lstSource = new List<MyClass> 
{ 
    new MyClass {i = 1, d = 1.2, s = "s1", c = '1'}, 
    new MyClass {i = 2, d = 2.2, s = "s2", c = '2'}, 
    new MyClass {i = 3, d = 3.2, s = "s3", c = '3'} 
}; 

現在我想要得到的一些這些名稱來自最終用戶的屬性併爲他提供一個包含想要屬性的匿名類型列表。用戶將我們想要的屬性列表作爲字符串的集合(所需屬性的名稱)。例如,假設通緝的屬性列表是這樣的:

var wantedProperties = new List<string> {"i", "s"}; 
  • 問題1:如何獲得這些只是從lstSource屬性?

  • 問題2:如何在匿名列表中提供每個屬性的類型作爲新變量?對於「wantedProperties」中的每個項目,它最多會將另一個變量添加到結果列表帽子顯示所需屬性的類型。在這個例子中,導致列表最是這樣的:

    { 
        {WantedProperty1_Value = 1,WantedProperty1_Type = typeof(int)}, 
        {WantedProperty2_Value = 2,WantedProperty2_Type = typeof(string)} 
    } 
    

回答

3

首先,你MyClass有領域,而不是屬性。例如,您必須將其更改爲public int i {get; set;}

現在,您可以使用反射來獲取類型由其名稱標識的屬性。

foreach(MyClass obj in lstSource) 
{ 
    foreach(string propertyName in wantedProperties) 
    { 
     PropertyInfo property = typeof(MyClass).GetProperty(propertyName); 

     object value = property.GetValue(obj); 
     Type propertyType = property.PropertyType; 
    } 
} 

如果屬性是不公開的,你必須使用一個different overload of GetProperty和使用BindingFlags.NonPublic | BindingFlags.Instance綁定標誌。

現在您只需構建結果集即可。

+0

噢,我很古怪: - |你是對的,那些班級的成員是田野。 – Merta

+0

此解決方案的工作原理,謝謝,但我需要創建一個表達式並將表達式傳遞給MyExpressionRunner以從實體框架獲取數據。我能否獲得有關創建執行此項工作的表達式的幫助? – Merta

+0

這是一個不容易在評論中回答的問題。請發佈一個新問題。此外,還要說明輸入數據和預期的輸出數據(實際表達式的外觀)。 – dcastro