C# 继承泛型类的对象列表
我为框架中的所有管理者提供了一个通用类。(例如,实体、游戏警报、物理和粒子管理器) 本质上,它们都做相同的事情。他们有一个东西的集合,他们需要更新这些东西,他们需要呈现这些东西(不是所有的管理者都需要呈现…,但无论如何)。所以我有一个泛型基类,它就是这样做的。我定义了它存储的“东西”C# 继承泛型类的对象列表,c#,list,generics,C#,List,Generics,我为框架中的所有管理者提供了一个通用类。(例如,实体、游戏警报、物理和粒子管理器) 本质上,它们都做相同的事情。他们有一个东西的集合,他们需要更新这些东西,他们需要呈现这些东西(不是所有的管理者都需要呈现…,但无论如何)。所以我有一个泛型基类,它就是这样做的。我定义了它存储的“东西” public class GenericManager<T> where T : Updatable 现在我想知道如何将所有这些经理放入经理列表中。我需要一种方法来存储它们,迭代它们,并在另一个管理器
public class GenericManager<T> where T : Updatable
现在我想知道如何将所有这些经理放入经理列表中。我需要一种方法来存储它们,迭代它们,并在另一个管理器中更新它们(我想)
PS这可能不是处理我正在做的事情的理想方法,但这实际上只是一个学习练习,让我更熟悉使用泛型。声明
IGenericManager
界面,让GenericManager:IGenericManager
并且您可以使用List
唯一的缺点是公开的方法不能是泛型的
更新:
interface IGenericManager
{
Type ManagerType { get; }
}
GenericManager<T> : IGenericManager
{
public Type ManagerType { get { return typeof(T) ; } }
}
接口IGenericManager
{
类型管理器类型{get;}
}
GenericManager:IGenericManager
{
公共类型管理器类型{get{return typeof(T);}}
}
您可以为基础通用管理器提取通用接口并使其协变:
public class GenericManager<T> :IGenericManager<T> where T : Updatable { }
public interface IGenericManager<out T> where T : Updatable { }
public class Updatable { }
class UpdatableX : Updatable {}
class UpdatableY : Updatable {}
public类GenericManager:IGenericManager其中T:updateable{}
公共接口IGenericManager,其中T:updateable{}
公共类可更新{}
类updateablex:updateable{}
类updateable:updateable{}
之后,您可以将所有资料放入列表中
:
var list=新列表
{new GenericManager(),new GenericManager()};
更新:忘了提一下,只有在.NET framework 4中才有可能,因为在以前的版本中,泛型不能是协变或逆变的。您可以使用一个简单的空管理器界面,根据扩展方法创建列表和交叉点,如下所示
public interface IGenericManager { }
public class GenericManager<T> : IGenericManager where T : Updateable { }
public class EntityManager : GenericManager<Entity> { }
var list = new List<IGenericManager>();
var entityManagers = list.OfType<EntityManager>();
公共接口IGenericManager{}
公共类GenericManager:IGenericManager,其中T:Updateable{}
公共类EntityManager:GenericManager{}
var list=新列表();
var entityManagers=list.OfType();
假设我正在经理列表中搜索我的entitymanager。有没有办法区分哪个对象是哪个对象?更新了答案-您现在可以做(伪代码):List().Single(x=>x.ManagerType==myType)
List().OfType()怎么样?这非常令人困惑EntityManager
似乎与GenericManager
没有任何关系,它声明了一个与类同名的类型参数。这是一种奇怪且容易出错的方法;你确定你不是有意要做class EntityManager:GenericManager
??我已经修正了这个例子。很抱歉造成混乱。这是一个漫长的一天,我必须做一些调查,但很快就会回来。我想这是我所追求的,尽管Jakub的解决方案很好。界面真的有必要吗?为什么不直接将协方差应用于GenericManager的模板参数呢。不能在类中使用变量参数,只能在接口或委托中使用。
public class GenericManager<T> :IGenericManager<T> where T : Updatable { }
public interface IGenericManager<out T> where T : Updatable { }
public class Updatable { }
class UpdatableX : Updatable {}
class UpdatableY : Updatable {}
var list = new List<IGenericManager<Updatable>>
{new GenericManager<UpdatableX>(), new GenericManager<UpdatableY>()};
public interface IGenericManager { }
public class GenericManager<T> : IGenericManager where T : Updateable { }
public class EntityManager : GenericManager<Entity> { }
var list = new List<IGenericManager>();
var entityManagers = list.OfType<EntityManager>();