Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 继承泛型类的对象列表_C#_List_Generics - Fatal编程技术网

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>();