类的可选类型参数

时间:2017-02-10 13:28:19

标签: c#

假设我想实现一个具有四种类型的泛型类 参数:

class ExampleClass<TA, TB, TC, TD> 
{ }

该课程将有许多用例&#39;所以可能发生TA和TB没有意义,而只需要TC和TD,反之亦然。是否有一种优雅的方法可以使一些类型参数可选?

3 个答案:

答案 0 :(得分:1)

像往常一样,这取决于。我可能会尝试将用例封装在一些静态工厂方法中,如下所示:

public class Example<TA, TB, TC, TD> 
{
  public TA PropA { get; set; }
  public TB PropB { get; set; }
  public TC PropC { get; set; }
  public TD PropD { get; set; }

  public static Example<T1, T2, Object, Object> Case1Factory<T1, T2>(T1 a, T2 b)
  {
    return new Example<T1, T2, Object, Object>()
    {
      PropA = a,
      PropB = b
    };
  }

  public static Example<object, object, T3, T4> Case2Factory<T3, T4>(T3 c, T4 d)
  {
    return new Example<Object, Object, T3, T4>()
    {
      PropC = c,
      PropD = d
    };
  }
}

如果您需要支持超过3或4个标准案例,我会改变方法。

答案 1 :(得分:0)

不,与C ++模板不同,没有“优雅”的方式;请参阅System.Tuple了解蛮力方法。请注意,客户端代码通常不是那么糟糕; ExampleClass.Create(...)代替new ExampleClass<T1, T2, T3>(...)

答案 2 :(得分:-1)

类型参数只定义类成员的类型。如果在任何成员中使用类型参数,那些成员需要type参数,因此它不能是可选的,但必须至少是Object类型。然后你可以决定不使用那些成员,但是类仍然需要类型。

此方案最优雅的方法是,为“可选”类型参数定义基类型,因为这样您可以忽略使用非特定类型作为类型参数的成员,因为基类型在用作类型时不提供任何功能参数。

一个例子:

public class MyClass<A, B> where A : BaseA, B : BaseB {

    public A doSmth(B input)
    {
         return input.someMethod();
    }
}

对于BaseA和BaseB的实现,这里不应该发生任何特殊情况,因此只要您希望它们是可选的,就可以使用它们。