我有一个表示动态值,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;,我希望列表中有几种类型的结构,而不仅仅是整个列表的一种类型
答案 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>());
答案 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>
。如果您正确地附上该列表,那么您也确保了类型安全。