确定类型等价

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)

我认为"中间人"方法更"正确",但我不想创造一个多余的类型.此外,它仍然存在交换类型参数创建两个不同但功能相同的类型的问题.

有没有更好的方法来实现我的目标?

Tim*_*lds 1

您可以有一个映射器来执行两种翻译,但只是让它定向,因为在您的情况下总是有“我的对象”和“数据库对象”配对。

interface IDbTypeModel<T, TDb>
{
    T FromDb(TDb dbObj);
    TDb ToDb(T obj);
}
Run Code Online (Sandbox Code Playgroud)