我想在用户控件中定义一个公共属性,其类型为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指令或程序集引用?)。我做错了什么
干杯
斯图尔特
答案 0 :(得分:2)
仅当包含属性的类是通用的时,才可以执行此操作。理论上,您可以使用通用方法:
void SetDataSource<T>(List<T> dataSource)
但你会丢失其他地方的类型信息。
可能,
IEnumerable DataSource
会是更好的选择吗?
答案 1 :(得分:1)
您不能在类的字段中使用泛型参数,而且该类不是通用的。
有关将usercontrol设为通用的信息,请参阅此答案:C# generics usercontrol
或者您可以使用非通用版本,例如IEnumerable
或IList
。
答案 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,我会考虑以下内容:
obj.GetType()
获取类型。 (根据您的需要,这可能有效,也可能无效)