【问题标题】:How can I set a Class Public Property as Type List<T>?如何将类公共属性设置为类型 List<T>?
【发布时间】:2011-07-07 21:03:19
【问题描述】:

我想在用户控件中定义一个公共属性,其类型为 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 指令或程序集引用?)。我做错了什么

干杯

斯图尔特

【问题讨论】:

  • 您需要为整个类分配一个泛型,或者将其更改为 List

标签: c# asp.net generics


【解决方案1】:

这只有在包含属性的类是通用的时候才有可能。理论上,您可以使用泛型方法:

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

但您会在别处丢失类型信息。

也许,

IEnumerable DataSource

会是更好的选择吗?

【讨论】:

    【解决方案2】:

    如果类没有泛型,就不能在类的字段中使用泛型参数。

    有关使用户控件通用的信息,请参阅此答案:C# generics usercontrol

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

    【讨论】:

      【解决方案3】:

      你要么需要定义泛型类型,要么让 RepeaterPager 泛型

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

      【讨论】:

      • 这样做的问题是我失去了对用户控件中页面控件的引用。大概是因为 Page 是继承了 RepeaterPager 而不是 RepeaterPager,所以我无法引用 txtSomeTextField.Text 等控件。
      【解决方案4】:

      这种类型的数据绑定的一般模式是将 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() 获取类型。 (根据您的需要,这可能会或可能不会起作用)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-06
        • 2011-05-09
        • 1970-01-01
        相关资源
        最近更新 更多