2012-11-21 83 views
0

我正在實現一個自定義控件,它接收T類型(作爲字符串)和IList中的屬性列表並將其呈現到HTML表格中。我有標記和CreateChildControls部分。IList中未知類型的訪問屬性<T>

我想要做的是通過反射通過屬性,並獲得在列表上運行的foreach循環內的屬性值。

我不知道T是在編譯時的東西,我希望能夠以適應列表任何T.

什麼是做到這一點的最好方法是什麼?

編輯:

public class CustomControl : System.Web.UI.WebControls.WebControl, INamingContainer 
{ 
    private List<string> _properties; 
    private **?????????** _dataSource; 

    public List<string> Properties 
    { set { _properties = value; } } 

    public **?????????** DataSource 
    { set { _dataSource = value; } } 
} 

現在可以說,我屬性的值設置爲這樣的事情:

_properties = new List<string>() 
     { 
      "FirstName", 
      "LastName" 
     }; 

,並傳遞類型的人的對象的列表:

public class Person 
{ 
    public string FirstName 
    { get; set; } 
    public string LastName 
    { get; set; } 
} 

這個人只是一個佔位符。我想爲List中的任何T做這個。 調用類知道類型T,而自定義控件不知道。此外,自定義控件本身不計劃爲通用類。 希望這有助於集中我的問題。

+0

那麼,你有什麼嘗試? (提示:'typeof(T).GetProperty(...)'是你的朋友...) –

+0

@JonSkeet - 列表的屬性應該是什麼類型? IList的?我需要投射嗎?如果是這樣,到什麼? –

+0

我不知道 - 我們對背景知之甚少。 (這可以是一個通用的方法,例如?或一個泛型類型?調用者知道該類型,還是應該動態?) –

回答

1

您可以將數據源定義爲普通的IEnumerable,然後使用反射來獲取每種類型的值。例如:

private IEnumerable _dataSource; 

foreach (object o in _dataSource) 
{ 
    foreach (string propName in _properties) 
    { 
     PropertyInfo prop = o.GetType().GetProperty(propName); 

     // ... 
    } 
}