C# 包含不同类型的泛型列表的泛型类

C# 包含不同类型的泛型列表的泛型类,c#,C#,我正在学习泛型,我有一个问题,那就是决定哪种方法更适合让泛型类包含一个泛型列表,它与包含类的类型不同,例如 public class Goal<T> { public string Name { get; set; } public int Priority { get; set; } public List<Goal<T>> Dependencies { get; set; } public T Value { get; se

我正在学习泛型,我有一个问题,那就是决定哪种方法更适合让泛型类包含一个泛型列表,它与包含类的类型不同,例如

public class Goal<T>
{
    public string Name { get; set; }
    public int Priority { get; set; }
    public List<Goal<T>> Dependencies { get; set; }
    public T Value { get; set; }

    public Goal(string name, int priority, T val)
    {
        Name = name;
        Priority = priority;
        Value = val;
        Dependencies = new List<Goal<T>>();
    }
}
公共类目标
{
公共字符串名称{get;set;}
公共int优先级{get;set;}
公共列表依赖项{get;set;}
公共T值{get;set;}
公共目标(字符串名称、int优先级、T val)
{
名称=名称;
优先级=优先级;
值=val;
依赖项=新列表();
}
}
让列表中的“依赖项”与包含类的类型不同的最佳方法是什么


感谢

唯一的通用解决方案是显式声明第二个通用类型

public class Goal<T, TChild>
{
    public T value { get; set; }
    public List<TChild> MyListWithAnotherType { get; set; }
}
公共类目标
{
公共T值{get;set;}
公共列表MyListWithAnother类型{get;set;}
}
但是,由于递归地使用该类(在
目标
中引用
目标
),因此这是不可能的。如果您尝试这样做,您会发现这将需要您提供无限的泛型类型参数链,因为您必须始终指定子目标的类型,这是一个无休止的序列(每个子目标都有自己的子目标,等等…)


这不是你想要的解决方法。但是如果有更详细的问题描述,可能会有不同的方法来解决您的问题。

您的意思是在
依赖项中有不同的
T
?是的。刚刚编辑了我的答案以更好地说明它。这在C#中不容易实现。有关更多信息,请参阅。有关建议实现
课程目标的所有答案,请参见。我觉得这是在提问时作弊。“类包含的泛型列表与包含的类的类型不同”是一个问题,而现在泛型类将了解两种类型!您可以让generic
Goal
从非generic abstract
Goal
继承,并使其成为列表中包含的类型。但是,您将需要运行时类型检查和/或强制转换,从而失去了泛型的许多好处。谢谢。我正在用BDI代理制作一个多代理系统,它可以有不同类型的目标。我试图让目标类包含代理所追求的实际对象,例如,一个目标可能是“find”,然后我希望包含目标(另一个代理、位置或其他)。此外,包含作为目标的价值代理的目标可能取决于其他目标,其中目标/价值是房间(类)或其他东西。这有意义吗?@Ruptr:这里有选择,但是你想要的那一个没有。在谷歌上搜索“C#递归类”,你会发现大量的例子。您可以不使用泛型类型,也可以使用重复的泛型类型(总是在每个级别上使用
T
,就像您的问题一样)。您不能总是在每个级别的类型之间切换,因为这将要求您在声明
Goal
变量时无限地列出要使用的类型。如果你想在每个级别上切换类型,你需要对它们进行硬编码(=非通用定义)。我要明确的是,硬编码指的是每个目标的目标类的子类?@Ruptr:我的意思是指定你想要的确切类型,而不是使用类型参数。例如,
class-AgentGoal:Goal{public-List-Dependencies{get;set;}}
(其中
class-FindGoal:Goal
)。这意味着您可以分别声明每个级别的泛型类型,而无需将它们全部折叠到一个无限类型定义中。您保留了原始的
Goal
类,但不是将其扩展为
Goal
类,而是在其他(非泛型)类中实现
Goal