我想对下面的泛型类型设置约束,但我不确定是否可以按照我想要的方式进行。
public interface IMyClass<in TA, in TB>
{
bool MyMethod<TX, TY>(TX argumentX, TY argumentY);
}
public class MyClass<TA, TB> : IMyClass<TA, TB>
{
public bool MyMethod<TX, TY>(TX argumentX, IEnumerable<TY> argumentsY)
{
// DO STUFF
}
}
类型TX和TY用于表示TA和TB,但需要可互换(这就是为什么我不能在方法中使用TA和TB而不重复代码)。这就是约束需要运行的方式:
有没有办法在设计时使用通用约束来强制执行此操作,还是必须使用异常在运行时实现它?
答案 0 :(得分:0)
简而言之,不,通用约束是附加的,不能基于布尔逻辑打开或关闭。非常值得怀疑的是,你能够做出哪些一般也适合这些类型的约束。
答案 1 :(得分:0)
不是直接但你可以用两个重载方法解决问题。
public class MyClass<TA, TB> : IMyClass<TA, TB>
{
public bool MyMethod(TA argumentX, TB argumentY)
{
string argX = SpecialPreFormatterForTA(argumentX);
string argY = SpecialPreFormatterForTB(argumentY);
return MyMethodCommon(argX, argY);
}
public bool MyMethod(TB argumentX, TA argumentY)
{
string argX = SpecialPreFormatterForTB(argumentX);
string argY = SpecialPreFormatterForTA(argumentY);
return MyMethodCommon(argX, argY);
}
private bool MyMethodCommon(string argX, string argY)
{
// DO STUFF
}
}
我对您使用代码执行的操作做了一些修改和一些假设,以帮助证明这一点。你可以在每个重载方法中做你需要做的任何特定格式化然后调用,然后你可以让两个函数调用第三个函数,它不关心两个原始参数的类型在哪里减少代码重用。