在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) {...}
}
我认为“中间人”方法更加“正确”,但我不想创建一个多余的类型。同时,它仍然存在一个问题,即交换类型参数会创建两种不同但功能等效的类型。
有更好的方法实现我的目标吗?
where A != B
的功能。 - Timothy Shieldsinterface DbTypeModel<T, TDb> { T FromDb(TDb); TDb ToDb(T); }
- Timothy Shields