泛型中的多态性

时间:2012-01-01 19:54:26

标签: c# list generics polymorphism constraints

我有一个表示动态值,max和min值以及其他一些字段的Generic结构,struct增加动态值直到达到最大值并减小直到达到最小值 - 然后来回循环。 当我希望这个结构代表几个数值类型时,问题出现了:double,uint,int32,float ...并且还在一个列表中存储了几个结构。 所以我得到的是这个结构实例的列表,它迫使我选择整个列表的结构类型 - 但我想在一个列表中使用各种类型。我怎么能实现这样的事情呢?我尝试使用约束并使“where T:object”,但它说我不能使用Object类作为约束......

public struct eField<T> where T : struct
{
    private string _fieldName;
    private T _value;
    private T _minVal;
    private T _maxVal;
    private double _duration;
}

public class Device
{
    private List<eField> _fields;
}

当然它会构成一个错误,说明eField必须得到一个类型参数T&gt;,我希望列表中有几种类型的结构,而不仅仅是整个列表的一种类型

3 个答案:

答案 0 :(得分:4)

根据您的示例,您似乎希望使用where T: struct,因此限制为值类型。

修改

public interface IeField { }

public class eField<T> : IeField where T : struct
{
    private string _fieldName;
    private T _value;
    private T _minVal;
    private T _maxVal;
    private double _duration;
}

并使用它。

List<IeField> fields;
fields.Add(new eField<int>());
fields.Add(new eField<uint>());
fields.Add(new eField<double>());

看看这篇文章 C# - Multiple generic types in one list

答案 1 :(得分:0)

您的问题将是eField<int>eField<float>没有共同的祖先类型(除了对象)。你要么需要:

private List<object> _fields;

此列表可能包含eField<int>eField<float>,但它也可能包含其他内容。或者您可以使用基类或接口:

public interface IField { ... }
public struct eField<T> : IField {...}

在这种情况下,您可以拥有List<IField>。如果IField上的方法不是通用的(void DoStuff()),那么你可以对它进行编码。如果IField有通用方法(它是IField<T>),那么你我会回到同一条船上。但是大概如果你要编写代码列表中所有项目的代码,它们之间会有一些共同之处。

答案 2 :(得分:0)

您可以使用一些mutator和accessor来包含对列表的访问。

public Device addField<T>(eField<T> field) where T : struct {
   this.fieldList.add(field);

  return this;
}

然后列表可以是List<Object>。如果您正确地附上该列表,那么您也确保了类型安全。