如何处理这个c#泛型问题?

时间:2009-02-04 17:54:48

标签: c# generics

我有一个继承List<>的基类它有多个派生自它的类。

我想创建一个方法,可以将项添加到从此基类继承的任何类,这可能吗?

伪代码:

public class BaseList<T> : List<T> where T: baseItem
{
}

public BaseList<T> AddItems<T>(int someArg) where T: new(), baseItem
{

BaseList<T> temp = new BaseList<T>();
temp.add(new T());
temp.add(new T());
return temp;
} 

public class MyDerived: BaseList<SomeClass>
{
}

然后调用此代码:

MyDerived temp = (MyDerived)AddItems();

是这样的吗?我无法弄清楚正确的语法

3 个答案:

答案 0 :(得分:4)

您真的需要从List<T>派生而不是使用合成吗?

听起来你想要一个非泛型类型的静态方法:

public static TList CreateList<TList,TItem>(int someArg)
    where TList : BaseList<TItem>, new()
    where TItem : baseItem, new()
{
    TList temp = new TList();
    temp.Add(new TItem());
    temp.Add(new TItem());
    return temp;
}

虽然这似乎并不特别好......也许如果你解释了这个目的,我们可以提出一个更好的主意。

答案 1 :(得分:2)

我无法理解你的问题,但我之前遇到过这个问题。如果你遇到了和我一样的问题:你不知道&lt; T&gt;编译时的参数。幸运的是,这是使用接口解决的问题 - 您可以使用非通用接口创建更强大的类型绑定。

class Program
{
    static void Main(string[] args)
    {
        IAddBaseItem addItem = new DerivedList();
        BaseItem item = new DerivedItem();
        IgnorantMethod(addItem, item);
    }

    static void IgnorantMethod(IAddBaseItem list, BaseItem item)
    {
        list.Add(item);
    }
}

class BaseItem
{
}

class BaseList<T> : List<T>, IAddBaseItem
{
    #region IAddBaseItem Members

    void IAddBaseItem.Add(BaseItem item)
    {
        if (item == null)
            Add(item);
        else
        {
            T typedItem = item as T;
            // If the 'as' operation fails the item isn't
            // of type T.
            if (typedItem == null)
                throw new ArgumentOutOfRangeException("T", "Wrong type");
            Add(typedItem);
        }
    }

    #endregion
}

class DerivedList : BaseList<DerivedItem>
{
}

class DerivedItem : BaseItem
{
}

interface IAddBaseItem
{
    void Add(BaseItem item);
}

正如我所说,这是我对你所要求的最佳猜测。

答案 2 :(得分:0)

您也可以使用

public static void AddItems<T>(List<T> list, int someArg) where T: new() {
    list.Add(new T());
    list.Add(new T());
}

并称之为:

List list = new List<SomeClass>();
AddItems(list, someArg);