gre*_*nis 7 c# types interface
是否有可能在C#(我使用.Net 4.5,但更普遍地要求)确定泛型类型的两个实现是否在功能上等效?
作为需求的一个例子,假设我有一个IMapper
接口定义为:
public interface IMapper<TTo, TFrom>
{
TTo MapFrom(TFrom obj);
TFrom MapFrom(TTo obj);
}
Run Code Online (Sandbox Code Playgroud)
我理想的实现是:
public class MyMapper : IMapper <A, B>
{
A MapFrom(B obj) {...}
B MapFrom(A obj) {...}
}
Run Code Online (Sandbox Code Playgroud)
这在功能上等同于:
public class MyEquivalentMapper : IMapper <B, A>
{
B MapFrom(A obj) {...}
A MapFrom(B obj) {...}
}
Run Code Online (Sandbox Code Playgroud)
但编译器(正确地)将这些识别为不同的类型.有没有办法告诉编译器将这两种类型视为等效(甚至可以互换)?
我也看过这个:
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) {...}
}
Run Code Online (Sandbox Code Playgroud)
但我发现我无法正确识别抽象,因此我可以注入(进入构造函数等)具体类而无需创建"中间人"接口:
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) {...}
}
Run Code Online (Sandbox Code Playgroud)
我认为"中间人"方法更"正确",但我不想创造一个多余的类型.此外,它仍然存在交换类型参数创建两个不同但功能相同的类型的问题.
有没有更好的方法来实现我的目标?
您可以有一个映射器来执行两种翻译,但只是让它定向,因为在您的情况下总是有“我的对象”和“数据库对象”配对。
interface IDbTypeModel<T, TDb>
{
T FromDb(TDb dbObj);
TDb ToDb(T obj);
}
Run Code Online (Sandbox Code Playgroud)