使用接口的泛型T列表

时间:2014-03-14 14:13:06

标签: c# list generics

遵循以下两个SO问题:

Is it possible to use a list of untyped generics in C#?

How am I able to create A List<T> containing an open generic Interface?

  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

我无法让它正常工作。我想象一下,它与我的界面以及我如何使用它有关。我希望能够调用构造函数并设置我需要的值。

我收到错误,例如&#34;修饰符&#39; abstract&#39;在字段上无效。试试一下房产&#34;和&#34;无法创建接口Value&#34;的抽象类的实例。但我也不能做新的IValue。

2 个答案:

答案 0 :(得分:5)

  • 您无法创建界面对象,因此无法执行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>看起来非常完整,并且鉴于您希望能够创建它,因此没有理由将其作为抽象类型。

答案 1 :(得分:1)

为什么要使用 abstract ?如果您想创建类实例,则该类不能是 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);