使用接口的泛型T列表 [英] List of Generics T using Interface

查看:111
本文介绍了使用接口的泛型T列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下这两个问题:

是否可以在C#中使用一个无类型的泛型?



  public interface IValue 
{
object Min {get ;组; }
对象Max {get;组; }
对象Avg {get;组; }
}

公共抽象类值< T> :IValue
{
abstract T Min;
abstract T Max;
abstract T Avg;
对象IValue.Avg {get {return Avg; }}
对象IValue.Min {get {return Min; }}
对象IValue.Max {get {return Max; }}

公共价值(T min,T max,T avg)
{
Min = min;
Max = max;
Avg = avg;


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

 值myValue =新值< ulong>(x,y,z); 
值myValue =新值< ushort>(x,y,z);
列表< IValue> myList = new List< IValue>();
myList.add(myValue);
//做类似myList [0] .Min

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



我得到类似修饰符'abstract'的字段错误。尝试使用属性相反和无法创建接口Value的抽象类的实例,但我也无法创建新的IValue。

解决方案

为什么你根本就使用 abstract ?如果您想创建类实例,那么该类不能是 abstract

  public class Value< T>:IValue {
//更好地将这些字段命名为min,max,ave或m_Min,m_Max,m_Ave
T Min;
T Max;
T平均;

//不要忘记设置访问器
对象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; }
}

公共价值(T min,T max,T avg){
Min = min;
Max = max;
Avg = avg;
}
}

...

//Value< ulong> myValue,而不是Value myValue
Value< ULONG> myValue = new Value< ulong>(x,y,z);
列表< IValue> myList = new List< IValue>();
myList.Add(myValue);


Following these two SO questions:

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

and

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;
    }
}

Somewhere else in code....

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

I can't get this to work properly. I Imagine it has to do with my interface and how I'm using it. I want to be able to call a constructor and set the values however I need to.

I get errors like "modifier 'abstract' not valid on fields. Try a property instead" and "Cannot create an instance of the abstract class of interface Value" but I also can't do new IValue either.

解决方案

Why do you use abstract at all? If you want to create class instances the class can't be 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);

这篇关于使用接口的泛型T列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆