是否可以将GenericClass <subclass>添加到List <genericclass <base>&gt;在C#?

时间:2016-03-31 01:29:27

标签: c# generics

我的C#项目中有三个类:GenericClass<T>,其中T可能是BaseClass或后代SubClass

我需要创建一个GenericClass<BaseClass>列表,该列表接受通用中的GenericClass<BaseClass>BaseClass的后代。我试图通过创建如下List<GenericClass<BaseClass>>来做到这一点:

List<GenericClass<BaseClass>> list = new List<GenericClass<BaseClass>>();
GenericClass<SubClass> test = new GenericClass<SubClass>();
list.Add( test );

C#拒绝执行此操作,告诉我GenericClass<SubClass>不是GenericClass<BaseClass>。为什么会这样?这似乎违反直觉,因为SubClassBaseClass的一种形式。

GenericClass<T>被设计为可注册类型,游戏脚本可以使用它来封装从基础对象下降的自定义游戏对象类型。有没有办法在不使用反射的情况下实现这一目标? BaseClass包含具有所有对象通用代码的方法,因此无法将其创建为接口。

2 个答案:

答案 0 :(得分:1)

您只能为 interfaces 执行此操作,而不能用于具体实现。

如果您的课程定义如下:

public interface IGeneric<out T> where T : BaseClass, new() { }
public class GenericClass<T> : IGeneric<T> where T : BaseClass, new() { }

public interface IBase { }
public class BaseClass { }
public class SubClass : BaseClass { }

你可以这样做:

List<IGeneric<BaseClass>> list = new List<IGeneric<BaseClass>>();
GenericClass<SubClass> test = new GenericClass<SubClass>();
list.Add(test);

请注意,列表通用参数为IGeneric,而不是GenericClass

答案 1 :(得分:0)

您可以添加基类并使GenericClass<T>继承自此基类:

public class GenericClass { }

public class GenericClass<T> : GenericClass { }

现在您可以创建List<GenericClass>

var list = new List<GenericClass>();
list.Add(new GenericClass<BaseClass>());
list.Add(new GenericClass<SubClass>());