C# 这是坏习惯吗?泛型接口的重载方法和返回不同类型

C# 这是坏习惯吗?泛型接口的重载方法和返回不同类型,c#,generics,interface,mapper,C#,Generics,Interface,Mapper,作为这个问题的后续行动: 我正在考虑使用一个非常简单的映射器界面: public interface IMap<T,U> { U MapFrom(T obj); T MapFrom(U obj); } 公共接口IMap { U MapFrom(T obj); T映射自(U obj); } 这也许是该问题讨论的一个更有针对性的例子。实现此接口的实例只是在类型之间映射。 我可以这样做: public interface IMap<T,U> { U

作为这个问题的后续行动:

我正在考虑使用一个非常简单的映射器界面:

public interface IMap<T,U>
{
    U MapFrom(T obj);
    T MapFrom(U obj);
}
公共接口IMap
{
U MapFrom(T obj);
T映射自(U obj);
}
这也许是该问题讨论的一个更有针对性的例子。实现此接口的实例只是在类型之间映射。
我可以这样做:

public interface IMap<T,U>
{
    U MapRight(T obj);
    T MapLeft(U obj);
}
公共接口IMap
{
图右(T obj);
T MapLeft(U obj);
}
但这看起来很愚蠢,因为从概念上讲,to和from的概念并不真正适用于我的通用映射器。这只是一张双向地图。 因此,为了补充相关问题:
这是一种不好的通用地图做法吗?

我应该如何命名方法以避免返回不同的类型而不影响接口的“通用性”?

编辑:另外,作为对答案的回应,这是为mapper准备的(这并不重要)。我只是没有在接口中包含映射方法


EDIT2:我想如果我有一个单方向映射器(或适配器),同样的问题也会出现,然后我为两个方向实现了两次。。。相同的方法名称,不同的返回类型。

这很难,因为您无法将T和U限制为不同的类型,因此您总是冒着让它们相同的风险。我想说的是,你只需要找到两个你可以接受的名字,比如:

  • 地图优先
  • 地图秒
或:

  • 地图
  • 反向映射
或:

  • 前进
  • 逆转

    • 首先,您不是在映射,而是在转换。这是不同的。映射是字典的功能。转换是当您输入一种类型并输出另一种类型时发生的情况

      我将创建如下界面:

      interface IConvertible<TSource, TResult>
      {
          TResult Convert(TSource source);
      }
      
      接口可转换
      {
      TResult Convert(TSource-source);
      }
      

      你想要双向转换吗?伟大的实现IConvertible和IConvertible。要将其封装到单个接口中吗?很好,创建ITwoWayConvertible并实现两者。

      当我实现接口时,如果U和T是相同的类型,我将无法编译,因为两个方法将具有相同的签名。但是U和T可能是由传递到参数中的同一类实现的接口。我同意詹姆斯的观点,让它有两个功能。我通常对重载非常小心,但这并不能解决问题。我最终还是得到了两个同名的方法,它们返回不同的类型。另外,我也使用字典来映射它们,它只是不属于我的接口,因为接口不关心我如何跟踪对象。