使用接口的泛型列表

本文关键字:泛型 列表 接口 | 更新日期: 2023-09-27 17:50:20

以下两个问题:

是否可以在c#中使用无类型泛型列表?

我如何能够创建一个列表<包含一个开放的通用接口?>

  public interface IValue
{
    object Min { get; set; }
    object Max { get; set; }
    object Avg { get; set; }
}
public abstract class Value<T> : IValue
{
     abstract T Min;
     abstract T Max;
     abstract T Avg;
    object IValue.Avg { get { return Avg; } }
    object IValue.Min { get { return Min; } }
    object IValue.Max { get { return Max; } }
    public Value(T min, T max, T avg)
    {
        Min = min;
        Max= max;
        Avg = avg;
    }
}

在代码的其他地方....

Value myValue = new Value<ulong>(x, y, z);
Value myValue = new Value<ushort>(x, y, z);
List<IValue> myList = new List<IValue>();
myList.add(myValue);
//Do stuff like myList[0].Min

我不能让这个正常工作。我想这与我的界面以及我使用它的方式有关。我希望能够调用构造函数并设置值,但我需要。

我得到错误,如"修饰符'抽象'无效的字段。尝试一个属性代替"answers"不能创建接口值的抽象类的实例",但我也不能做新的IValue。

使用接口的泛型列表

  • 你不能创建一个接口的对象,所以你不能做new IValue()

  • 你不能创建一个抽象类型的对象,所以你也不能做new Value<SomeType>()

  • Value<T>MinMaxAvg字段,不能抽象。你想用属性代替:

    public abstract T Min { get; set; }
    public abstract T Max { get; set; }
    public abstract T Avg { get; set; }
    
  • 你可能根本不想使用abstractValue<T>看起来非常完整,并且考虑到您希望能够创建它,没有理由将其作为抽象类型。

为什么要用abstract呢?如果你想创建类实例,类不能是抽象

public class Value<T>: IValue {
  // Better to name these fields as "min, max, ave" or "m_Min, m_Max, m_Ave"
  T Min;
  T Max;
  T Avg;
  // Do not forget about "set" accessors
  object IValue.Avg {
    get { return Avg; }
    set { Avg = (T) value; }
  }
  object IValue.Min {
    get { return Min; }
    set { Min = (T) value; }
  }
  object IValue.Max {
    get { return Max; }
    set { Max = (T) value; }
  }
  public Value(T min, T max, T avg) {
    Min = min;
    Max = max;
    Avg = avg;
  }
}
...
// "Value<ulong> myValue" instead of "Value myValue "
Value<ulong> myValue = new Value<ulong>(x, y, z);
List<IValue> myList = new List<IValue>();
myList.Add(myValue);