如何将类公共属性设置为类型列表<t>?</t>

时间:2011-07-06 09:54:01

标签: c# asp.net generics

我想在用户控件中定义一个公共属性,其类型为List,我可以将List传递给,然后让控件将它绑定到转发器。

public partial class RepeaterPager : System.Web.UI.UserControl
{
    public List<T> DataSource;
}

来自调用代码

List<someClass> list = new List<someClass>;
RepeaterPager1.DataSource = list ;

我认为这很简单,但我收到错误在声明公共属性的行上找不到类型或命名空间名称'T'(您是否缺少using指令或程序集引用?)。我做错了什么

干杯

斯图尔特

4 个答案:

答案 0 :(得分:2)

仅当包含属性的类是通用的时,才可以执行此操作。理论上,您可以使用通用方法:

void SetDataSource<T>(List<T> dataSource)

但你会丢失其他地方的类型信息。

可能,

IEnumerable DataSource

会是更好的选择吗?

答案 1 :(得分:1)

您不能在类的字段中使用泛型参数,而且该类不是通用的。

有关将usercontrol设为通用的信息,请参阅此答案:C# generics usercontrol

或者您可以使用非通用版本,例如IEnumerableIList

答案 2 :(得分:0)

您需要定义通用类型,或者使RepeaterPager通用

public partial class RepeaterPager<T> : System.Web.UI.UserControl
{
    public List<T> DataSource;
}

答案 3 :(得分:0)

此类数据绑定的一般模式是将DataSource定义为类型对象。然后,在set方法中,您可以执行运行时检查以验证对象是否为您期望的类型 - 否则抛出异常或调试断言。

此外,Repeater.DataSource无论如何都是类型对象......

很多时候,我可以在不保留对数据源的引用的情况下离开,所以我将它直接传递给控件:

public object DataSource
{
    get { return myRepeater.DataSource; }
    set {
        if (value is IEnumerable) // or whatever your requirement is, if needed
            myRepeater.DataSource = value;
        else
            throw new NotSupportedException("DataSource must be an IEnumerable type");
    }
}

但是,如果您确实需要了解类型T,我会考虑以下内容:

  1. 如果可能,请使用其他人建议的通用类概念。
  2. 如果您需要为不同的类重复此模式,请为您的所有数据源构建基类或接口
  3. 使用DataSource作为类型对象,但只需在运行时使用obj.GetType()获取类型。 (根据您的需要,这可能有效,也可能无效)