2012-11-21 41 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); 

     // ... 
    } 
}