C# 为什么可以';我的IList实现不能用作数据源

C# 为什么可以';我的IList实现不能用作数据源,c#,objectdatasource,C#,Objectdatasource,我想将我的对象任务集合绑定到我的复选框taskCollection实现接口IList 当我尝试将它用作数据源时,我得到了错误 System.ArgumentException:复杂数据绑定接受IList或IListSource作为数据源 这是我的TaskCollection: using System; using System.Collections.Generic; using System.IO; namespace CLBatchGUI { /// <summary>

我想将我的对象
任务集合
绑定到我的
复选框
taskCollection
实现接口
IList

当我尝试将它用作数据源时,我得到了错误

System.ArgumentException:复杂数据绑定接受IList或IListSource作为数据源

这是我的
TaskCollection

using System;
using System.Collections.Generic;
using System.IO;

namespace CLBatchGUI
{
    /// <summary>
    /// Description of TaskCollection.
    /// </summary>
    public class TaskCollection:IList<Task>
    {
        private List<Task> _tasks;

        public TaskCollection()
        {
            _tasks = new List<Task>();
        }

        public void executeTasks(){
        }

        public static void loadFromCSV(string path){
        }

        public void saveToCSV(string path){
            StreamWriter sw= new StreamWriter(path);
            saveToCSV(sw);
        }

        public void saveToCSV(TextWriter sw){
            if(_tasks.Count==0)
                throw new ApplicationException("There are no tasks to save");
            foreach (var Task in _tasks) {
                Task.validate();
            }

            try{
                sw.Write("TaskName,");
                for(int i=0;i<_tasks[0].job.parameters.Count;i++){
                    sw.Write(_tasks[0].job.parameters[i].Name);
                    if(i==_tasks.Count-1)
                        sw.Write("\n");
                    else
                        sw.Write(",");
                }
                for(int i=0;i<_tasks.Count;i++){
                    sw.Write(_tasks[i].Name +",");
                    for(int n=0;n<_tasks[i].job.parameters.Count;n++){
                        sw.Write(_tasks[i].job.parameters[n].Text);
                        if(n==_tasks[i].job.parameters.Count-1)
                            sw.Write("\n");
                        else
                            sw.Write(",");
                    }


                }
            }catch(Exception ex){
                throw new ApplicationException(ex.Message);
            }

        }

        public Task this[int index]{
            get{
                return _tasks[index];
            }
            set{
                _tasks[index]=value;
            }
        }

        public int Count {
            get {
                return _tasks.Count;
            }
        }

        public bool IsReadOnly {
            get {
                return false;
            }
        }

        public int IndexOf(Task item)
        {
            return _tasks.IndexOf(item);
        }

        public void Insert(int index, Task item)
        {
            _tasks.Insert(index,item);
        }

        public void RemoveAt(int index)
        {
            _tasks.RemoveAt(index);
        }

        public void Add(Task item)
        {
            _tasks.Add(item);
        }

        public void Clear()
        {
            _tasks.Clear();
        }

        public bool Contains(Task item)
        {
            return _tasks.Contains(item);
        }

        public void CopyTo(Task[] array, int arrayIndex)
        {
            _tasks.CopyTo(array,arrayIndex);
        }

        public bool Remove(Task item)
        {
            return _tasks.Remove(item);
        }

        public IEnumerator<Task> GetEnumerator()
        {
            return _tasks.GetEnumerator();
        }

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return _tasks.GetEnumerator();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.IO;
命名空间CLBatchGUI
{
/// 
///TaskCollection的说明。
/// 
公共类任务集合:IList
{
私有列表任务;
公共任务集合()
{
_任务=新列表();
}
public void executeTasks(){
}
公共静态void loadFromCSV(字符串路径){
}
公共void saveToCSV(字符串路径){
StreamWriter sw=新StreamWriter(路径);
saveToCSV(西南);
}
公共void saveToCSV(TextWriter sw){
如果(_tasks.Count==0)
抛出新的ApplicationException(“没有要保存的任务”);
foreach(var任务在_任务中){
Task.validate();
}
试一试{
sw.Write(“任务名”);

对于(int i=0;i,您的类必须实现
IList
IListSource
,错误消息告诉您

您发布的类实现了
IList
,但不是
IList

因此,您必须自己实现
IList
。您可以显式地实现,这样您就不会意外地添加一个
对象
,而该对象不是
任务
(因为非泛型的
添加
方法将被隐藏),只要不显式地将
TaskCollection
强制转换为
IList
并调用非泛型的
Add
方法

public class TaskCollection : IList<Task>, IList
{
    int IList.Add(object value)
    {
        // just call the generic version
        Add((Task)value);
    }

    int IList.IndexOf(object value)
    {
        // just call the generic version
        return IndexOf((Task)value);
    }

    ...
}
公共类任务集合:IList,IList
{
int IList.Add(对象值)
{
//只需调用通用版本
添加((任务)值);
}
int IList.IndexOf(对象值)
{
//只需调用通用版本
返回IndexOf((任务)值);
}
...
}

错误消息告诉您,您的类必须实现
IList
IListSource

您发布的类实现了
IList
,但不是
IList

因此,您必须自己实现
IList
。您可以显式地实现,这样您就不会意外地添加一个
对象
,而该对象不是
任务
(因为非泛型的
添加
方法将被隐藏),只要不显式地将
TaskCollection
强制转换为
IList
并调用非泛型的
Add
方法

public class TaskCollection : IList<Task>, IList
{
    int IList.Add(object value)
    {
        // just call the generic version
        Add((Task)value);
    }

    int IList.IndexOf(object value)
    {
        // just call the generic version
        return IndexOf((Task)value);
    }

    ...
}
公共类任务集合:IList,IList
{
int IList.Add(对象值)
{
//只需调用通用版本
添加((任务)值);
}
int IList.IndexOf(对象值)
{
//只需调用通用版本
返回IndexOf((任务)值);
}
...
}

错误消息告诉您,您的类必须实现
IList
IListSource

您发布的类实现了
IList
,但不是
IList

因此,您必须自己实现
IList
。您可以显式地实现,这样您就不会意外地添加一个
对象
,而该对象不是
任务
(因为非泛型的
添加
方法将被隐藏),只要不显式地将
TaskCollection
强制转换为
IList
并调用非泛型的
Add
方法

public class TaskCollection : IList<Task>, IList
{
    int IList.Add(object value)
    {
        // just call the generic version
        Add((Task)value);
    }

    int IList.IndexOf(object value)
    {
        // just call the generic version
        return IndexOf((Task)value);
    }

    ...
}
公共类任务集合:IList,IList
{
int IList.Add(对象值)
{
//只需调用通用版本
添加((任务)值);
}
int IList.IndexOf(对象值)
{
//只需调用通用版本
返回IndexOf((任务)值);
}
...
}

错误消息告诉您,您的类必须实现
IList
IListSource

您发布的类实现了
IList
,但不是
IList

因此,您必须自己实现
IList
。您可以显式地实现,这样您就不会意外地添加一个
对象
,而该对象不是
任务
(因为非泛型的
添加
方法将被隐藏),只要不显式地将
TaskCollection
强制转换为
IList
并调用非泛型的
Add
方法

public class TaskCollection : IList<Task>, IList
{
    int IList.Add(object value)
    {
        // just call the generic version
        Add((Task)value);
    }

    int IList.IndexOf(object value)
    {
        // just call the generic version
        return IndexOf((Task)value);
    }

    ...
}
公共类任务集合:IList,IList
{
int IList.Add(对象值)
{
//只需调用通用版本
添加((任务)值);
}
int IList.IndexOf(对象值)
{
//只需调用通用版本
返回IndexOf((任务)值);
}
...
}

参考资料:@Shoe:一个更好的参考资料:这可能不会是一个问题,但有没有办法强迫T成为任务?@DominicKexel如果我实现IList,我必须实现一系列将T作为泛型类型的方法。我不希望使用TaskCollection的人使用Task以外的任何类型。很可能我不理解imp限制泛型类型接口已经足够好了。@Ukemi不,如果你实现了BT
IList
,你必须实现一系列方法,这些方法不使用
Task
,而是使用
object
。但是我在这里看到了你的问题。请看我的更新。参考资料:@Shoe:一个更好的参考:这可能不会是一个问题,但是对于C来说有什么问题吗T是任务吗?@DominicKexel如果我实现IList,我必须实现一系列使用T作为泛型类型的方法。我不希望任何使用TaskCollection的人使用Task以外的任何类型。很可能我对实现泛型类型接口的理解不够。@Ukemi不,如果你实现IList
IList
你必须实现不是一堆不使用
任务
,而是使用
对象
的方法