本帖最后由 sxdxgzr@126.com 于 2013-7-19 21:06 编辑
1原理:支持foreach语法要求数据源A实现了IEnumerable接口 ,这个可以用ilasm.exe 工具查看含有foreach代码块生成的IL,可以看到生成的相应的IL包含调用GetEnumerator()方法,该方法返回一个实现了IEnumerator<out T>接口的迭代器对象,返回的迭代器调用了 MoveNext()方法并将 Current值返回,处理完后继续调用MoveNext()方法,至数据源数据都被访问。(其他就不罗嗦了 msdn上面讲很详细)
以下是相关几个接口的定义- [ComVisible(true), Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A"), __DynamicallyInvokable]
- public interface IEnumerable
- {
- [DispId(-4), __DynamicallyInvokable]
- IEnumerator GetEnumerator();
- }
- [__DynamicallyInvokable]
- public interface IEnumerator<out T> : IDisposable, IEnumerator
- {
- // Properties
- [__DynamicallyInvokable]
- T Current { [__DynamicallyInvokable] get; }
- }
- [ComVisible(true), Guid("496B0ABF-CDEE-11d3-88E8-00902754C43A"), __DynamicallyInvokable]
- public interface IEnumerator
- {
- [__DynamicallyInvokable]
- bool MoveNext();
- [__DynamicallyInvokable]
- object Current { [__DynamicallyInvokable] get; }
- [__DynamicallyInvokable]
- void Reset();
- }
复制代码 2解决楼主问题:
1报错原因: System.Web.UI.WebControls.DataList类型定义: public class DataList : BaseDataList, INamingContainer, IRepeatInfoUser, IWizardSideBarListControl 表明其并未实现IEnumerable接口 不支持foreach语句
2解决方法:IWizardSideBarListControl 接口定义- internal interface IWizardSideBarListControl
- {
- // Events
- abstract event CommandEventHandler ItemCommand;
- abstract event EventHandler<WizardSideBarListControlItemEventArgs> ItemDataBound;
- // Methods
- void DataBind();
- // Properties
- object DataSource { get; set; }
- IEnumerable Items { get; }
- ITemplate ItemTemplate { get; set; }
- int SelectedIndex { get; set; }
- }
复制代码 可以看到有个 IEnumerable Items { get; }属性 而System.Web.UI.WebControls.DataList类型实现了此属性,楼主foreach里面可以用这个属性完成相应的功能。
|