假设我想实现一个具有四种类型的泛型类 参数:
class ExampleClass<TA, TB, TC, TD>
{ }
该课程将有许多用例&#39;所以可能发生TA和TB没有意义,而只需要TC和TD,反之亦然。是否有一种优雅的方法可以使一些类型参数可选?
答案 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的实现,这里不应该发生任何特殊情况,因此只要您希望它们是可选的,就可以使用它们。