是否可以在 C# 中(我使用的是 .Net 4.5,但更一般地询问)来确定泛型类型的两个实现是否在功能上等效?
作为需求的一个例子,假设我有一个IMapper
接口定义为:
public interface IMapper<TTo, TFrom>
{
TTo MapFrom(TFrom obj);
TFrom MapFrom(TTo obj);
}
我的理想实现是:
public class MyMapper : IMapper <A, B>
{
A MapFrom(B obj) {...}
B MapFrom(A obj) {...}
}
这在功能上等同于:
public class MyEquivalentMapper : IMapper <B, A>
{
B MapFrom(A obj) {...}
A MapFrom(B obj) {...}
}
但是编译器(正确地)将它们识别为不同的类型。有没有办法告诉编译器将这两种类型视为等效(甚至可以互换)?
我也看过这个:
public interface ISingleMapper<out TTo, in TFrom>
{
TTo MapFrom(TFrom obj);
}
public class MyAlternateMapper :
ISingleMapper<A, B>,
ISingleMapper<B, A>
{
A MapFrom(B obj) {...}
B MapFrom(A obj) {...}
}
但我发现我无法正确识别抽象,因此我可以在不创建“中间人”接口的情况下注入(到构造函数等)具体类:
public interface IBidirectionalMapper<TTo, TFrom> :
ISingleMapper<TTo, TFrom>,
ISingleMapper<TFrom, TTo>
{
TTo MapFrom(TFrom obj);
TFrom MapFrom(TTo obj);
}
public class MyAlternateMapper : IBidirectionalMapper<A, B>
{
A MapFrom(B obj) {...}
B MapFrom(A obj) {...}
}
我认为“中间人”方法更“正确”,但我不想创建一个多余的类型。此外,它仍然存在交换类型参数会创建两种不同但功能等效的类型的问题。
有没有更好的方法来实现我的目标?