【发布时间】:2013-02-07 00:56:38
【问题描述】:
是否可以在 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) {...}
}
我认为“中间人”方法更“正确”,但我不希望创建多余的类型。此外,它仍然存在交换类型参数会创建两个不同但功能等效类型的问题。
有没有更好的方法来实现我的目标?
【问题讨论】: