[英]Polymorphism in Generic types
我有一个表示动态值,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>,我希望列表有几种类型的结构,而不仅仅是整个列表的一种类型
根据您的示例,看起来您想要使用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# - 一个列表中的多个泛型类型
你的问题是eField<int>
和eField<float>
没有共同的祖先类型(除了object)。 你要么需要:
private List<object> _fields;
此列表可以包含eField<int>
或eField<float>
,但它也可以包含其他内容。 或者您可以使用基类或接口:
public interface IField { ... }
public struct eField<T> : IField {...}
在这种情况下,您可以拥有List<IField>
。 如果IField上的方法不是通用的(void DoStuff()),那么你可以对它进行编码。 如果IField有通用方法(它是IField<T>
),那么你我会回到同一条船上。 但大概如果你正在编写列表中所有项目的代码,它们之间会有一些共同之处。
您可以使用一些mutator和accessor来包含对列表的访问。
public Device addField<T>(eField<T> field) where T : struct {
this.fieldList.add(field);
return this;
}
然后列表可以是List<Object>
。 如果您正确地附上该列表,那么您也确保了类型安全。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.