我的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>
。为什么会这样?这似乎违反直觉,因为SubClass
是BaseClass
的一种形式。
GenericClass<T>
被设计为可注册类型,游戏脚本可以使用它来封装从基础对象下降的自定义游戏对象类型。有没有办法在不使用反射的情况下实现这一目标? BaseClass
包含具有所有对象通用代码的方法,因此无法将其创建为接口。
答案 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>());