是否有一种技术可以区分泛型类型的类行为?

时间:2010-10-15 15:30:09

标签: c# generics type-constraints

我想做类似以下的事情,但因为 T 基本上只是一个 System.Object ,所以这不起作用。我知道 T 可以受到接口的约束,但这不是一个选项。

public class Vborr<T> where T : struct
  {

    public Vborr()
    {
    public T Next()
    {
      if ( typeof( T ) == typeof( Double ) )
      {
         // do something for doubles
      }
      if ( typeof( T ) == typeof( Float ) )
      {
         // do something different for floats..
      }
    }
  }

我经常发现C#generics缺乏。

谢谢!

2 个答案:

答案 0 :(得分:7)

泛型的全部意义在于你可以为任何有效类型做同样的事情。

如果您真的在为类型做特定的事情,那么该方法不再是通用的,应该为每种特定类型重载。

public class Vborr<T> where T : struct
{
    public virtual T Next() { // Generic Implementation }
}

public class VborrInt : Vborr<int>
{
    public override int Next() { // Specific to int }
}

public class VborrDouble : Vborr<double>
{
    public override double Next() { // Specific to double }
}

答案 1 :(得分:1)

我将采用的方法是工厂模式,并根据类型创建Vborr的专用实例。例如

public class Vborr<T> where T : struct {
  protected Vborr() { }
  abstract T Next();
}

public static class VborrFactory { 
  private sealed class VborrFloat : Vborr<float> {
    public VborrFloat() {}
    public override float Next() {
      ...
    }
  }
  private sealed class VborrDouble : Vborr<double> {
    public VborrDobule() {}
    public override double Next() {
      ...
    }
  }
  private sealed class VborrDefault<U> : Vborr<U> {
    public VborrDefault() {}
    public override U Next() {
      ...
    }
  }
  public static Vborr<T> Create<T>() {
    if (typeof(T) == typeof(double) ) { 
      return new VborrDouble();
    } else if ( typeof(T) == typeof(float) ) {
      return new VborrFloat();
    } else {
      return new VborrDefault<T>();
    }
  }
}