如何克服C#List<;通用<;T>&燃气轮机;约束

如何克服C#List<;通用<;T>&燃气轮机;约束,c#,list,generics,inheritance,C#,List,Generics,Inheritance,我有以下情况: 我有几个事件类,它们共享StartEvent和StopEvent等常见行为。 我还有一个特殊的类,每个事件类都与之合作(如皮卡,您需要收集所有事件以完成事件) 因此,我认为我应该将BaseEvent类设置为泛型,每个派生版本都提供其特殊的合作伙伴类,这样我就可以有一个基本实现来将每个类保留在它们的列表中,等等。 现在棘手的部分是,我有一个EventManager,它需要知道所有事件。但据我所知,C#无法做到这一点: List<BaseEvent<T>> b

我有以下情况:

我有几个事件类,它们共享StartEvent和StopEvent等常见行为。
我还有一个特殊的类,每个事件类都与之合作(如皮卡,您需要收集所有事件以完成事件)
因此,我认为我应该将BaseEvent类设置为泛型,每个派生版本都提供其特殊的合作伙伴类,这样我就可以有一个基本实现来将每个类保留在它们的列表中,等等。
现在棘手的部分是,我有一个EventManager,它需要知道所有事件。但据我所知,C#无法做到这一点:

List<BaseEvent<T>> baseEvents = new List<BaseEvent<T>>();
List baseEvents=new List();

这个简单的限制扼杀了整个概念。我读过关于使用与基类并行的接口来将它们放入列表的内容,但这真的是我唯一的选择吗?

简单的选择是让
BaseEvent
实现一个接口或基类:

public interface IBaseEvent
{
}

public class BaseEvent<T> : IBaseEvent
{
}
公共接口IBaseEvent
{
}
公共类BaseEvent:IBaseEvent
{
}
现在您可以执行以下操作:

List<IBaseEvent> baseEvents = new List<IBaseEvent>();

baseEvents.Add(new BaseEvent<string>());
baseEvents.Add(new BaseEvent<int>());
List baseEvents=new List();
添加(新的BaseEvent());
添加(新的BaseEvent());

简单的选择是使
BaseEvent
实现接口或基类:

public interface IBaseEvent
{
}

public class BaseEvent<T> : IBaseEvent
{
}
公共接口IBaseEvent
{
}
公共类BaseEvent:IBaseEvent
{
}
现在您可以执行以下操作:

List<IBaseEvent> baseEvents = new List<IBaseEvent>();

baseEvents.Add(new BaseEvent<string>());
baseEvents.Add(new BaseEvent<int>());
List baseEvents=new List();
添加(新的BaseEvent());
添加(新的BaseEvent());

您的代码是否未编译?您的实现应该可以工作

static class Program
{
    /// <summary>
    /// Der Haupteinstiegspunkt für die Anwendung.
    /// </summary>
    [STAThread]
    static void Main()
    {
        var x = new EventManager<Partner>();
    }
}

public class EventManager<T>
{
    List<BaseEvent<T>> baseEvents = new List<BaseEvent<T>>();
}

public class BaseEvent<T>
{
}

public class MyEvent<T> : BaseEvent<T>
{
}

public class Partner
{
}
静态类程序
{
/// 
///这是一个很好的例子。
/// 
[状态线程]
静态void Main()
{
var x=新的EventManager();
}
}
公共类事件管理器
{
List baseEvents=新列表();
}
公共类基本事件
{
}
公共类MyEvent:BaseEvent
{
}
公共课伙伴
{
}

您的代码是否未编译?您的实现应该可以工作

static class Program
{
    /// <summary>
    /// Der Haupteinstiegspunkt für die Anwendung.
    /// </summary>
    [STAThread]
    static void Main()
    {
        var x = new EventManager<Partner>();
    }
}

public class EventManager<T>
{
    List<BaseEvent<T>> baseEvents = new List<BaseEvent<T>>();
}

public class BaseEvent<T>
{
}

public class MyEvent<T> : BaseEvent<T>
{
}

public class Partner
{
}
静态类程序
{
/// 
///这是一个很好的例子。
/// 
[状态线程]
静态void Main()
{
var x=新的EventManager();
}
}
公共类事件管理器
{
List baseEvents=新列表();
}
公共类基本事件
{
}
公共类MyEvent:BaseEvent
{
}
公共课伙伴
{
}

为什么不将BaseEvent作为BaseEvent的基类呢?我不太确定您在做什么,但首先想到的是:
List baseEvents=new List()
给定一个泛型类
C
C
C
不是
C
的“兄弟”子类
C
不是一个可以引用的具体类。但是,如果
C
B类
的子类,那么
C
C
都是
B
的子类。同样,如果
C
实现
IFoo
C
C
都实现
IFoo
。所以你的问题的标准解决方案是musefan和DavidG所建议的:把你能做的一切都转移到一个非泛型的基类或接口中,并从中继承
BaseEvent
。好家伙。要么是另一个子类,要么是一个接口,好吧。为什么不把BaseEvent作为BaseEvent的基类呢?我不太清楚你在做什么,但首先想到的是:
List baseEvents=new List()
给定一个泛型类
C
C
C
不是
C
的“兄弟”子类
C
不是一个可以引用的具体类。但是,如果
C
B类
的子类,那么
C
C
都是
B
的子类。同样,如果
C
实现
IFoo
C
C
都实现
IFoo
。所以你的问题的标准解决方案是musefan和DavidG所建议的:把你能做的一切都转移到一个非泛型的基类或接口中,并从中继承
BaseEvent
。好家伙。要么是另一个子类,要么是一个接口,好吧。我想他有BaseEvent、BaseEvent等等@Sebastian Schulz这正是不起作用的:
List baseEvents=new List()我认为他有BaseEvent、BaseEvent等@Sebastian Schulz这正是不起作用的:
List baseEvents=new List()