我有一个继承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();
是这样的吗?我无法弄清楚正确的语法
答案 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);