如何在抽象类(C#)的泛型集合中使用派生类型?

时间:2011-08-01 03:58:29

标签: generics c#-4.0 collections types

我有一个泛型集合,其中包含集合中的项目需要调用的方法。每个项目都有对泛型集合的引用。问题是我不能将每个项目的类型用作传递给泛型集合的类型。

这个想法是这样的(我知道它不能编译):

    public class MyCollection<T>
    {
        public void Call(T item) { ... }
    }

    public abstract class MyItemBase
    {
        protected MyCollection<typeof(this)> _collection;
        public MyItem(MyCollection<typeof(this)> collection)
        {
            this._collection = collection;
        }

        public DoSomething()
        {
            this._collection.Call(this);
        }
    }

    public class MyItem : MyItemBase
    {
    }

显然,你不能声明 MyCollection<typeof(this)> ,但我认为通过这种方式编写,你可以大致了解我正在尝试做什么。基本上,我希望抽象类对集合的引用意味着 MyCollection<MyClass>

有没有办法让这项工作?

1 个答案:

答案 0 :(得分:1)

首先,为什么您的ItemBase类包含ItemCollection?如果不是反之亦然,那么Collection类应该包含Items?

但是对于您的问题上下文,如果您以这种方式设计类,则可以输入类型:

 public class MyCollection<T> where T : MyItemBase<T>
{
    public void Call(MyItemBase<T> item) { }
}

public abstract class MyItemBase<T> where T : MyItemBase<T>
{
    protected MyCollection<T> _collection;

    protected MyItemBase(MyCollection<T> collection)
    {
        _collection = collection;
    }

    public void DoSomething()
    {
        _collection.Call(this);
    }
}

public class MyItem : MyItemBase<MyItem>
{
    public MyItem(MyCollection<MyItem> Collection)
        : base(Collection)
    {
    }
}