基于 C# 泛型的对象到对象映射器问题

标签 c# generics mapper

我的应用程序中需要一个对象到对象映射器。我已经尝试了一些,但一直无法找到适合我需要的东西,所以我正在写我自己的。目前我有如下界面:

public interface IMapper<T, R> {
    T Map(R obj);
}

然后我实现一个 AccountMapper,将客户映射到一个帐户:

public class AccountMapper : IMapper<Account, Customer> {
    Account Map(Customer obj) {
        // mapping code
    }
}

目前为止一切正常,但是我有几个源实体映射到同一个目标实体。例如,我有一个 Payment 和一个 Invoice 都映射到 BillHistory。为了支持以上内容,我需要制作两个单独的映射器(即 BillHistoryPaymentMapper 和 BillHistoryInvoiceMapper),这很好。但是,我希望能够像下面这样稍微不同地实现它。唯一的问题是我不知道是否可行,如果可行,我不知道正确的语法。

public interface IMapper<T> {
    T Map<R>(R obj);
}

public class BillHistoryMapper : IMapper<Account> {
    public BillHistory Map<Invoice>(Invoice obj) {
        // mapping code
    }
    public BillHistory Map<Payment>(Payment obj) {
        // mapping code
    }
}

虽然第一个实现工作正常,但第二个会稍微优雅一些​​。这可能吗?如果可能的话,正确的语法是什么样的?

编辑-------

我讨厌人们这样做,但当然我忘了提一个小细节。我们在映射器和接口(interface)之间有一个抽象类,用于在所有映射器之间实现一些通用逻辑。所以我的映射器签名实际上是:

public class BillHistoryMapper : Mapper<BillHistory, Invoice> {
}

其中 Mapper 包含:

public abstract class Mapper<T, R> : IMapper<T, R> {
    public IList<T> Map(IList<R> objList) {
        return objList.ToList<R>().ConvertAll<T>(new Converter<T, R>(Map));
    }
}

最佳答案

您必须使用您的第一个接口(interface)并在您的对象上多次实现该接口(interface):

public class BillHistoryMapper : IMapper<Account, Invoice>, 
                                 IMapper<Account, Payment> {     
   ...
}

我会认真考虑看看 AutoMapper而不是自己写。它已经解决了映射中的许多细微差别,更不用说它已经通过了大量的性能测试、错误修复等。

关于基于 C# 泛型的对象到对象映射器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2829624/

相关文章:

c# - 创建调试信息时出错 - 代码无法编译

c# - 如何结合 Service Fabric Remoting 进行分区

c# - C# 子数组中的 JSON 反序列化

java - 通用接口(interface)实现不起作用

java - 对原始值的泛型转换导致 ClassCastException

java - 将不带引号的json字符串转换为 map

java - 创建自定义 XPath 函数来修改 Java 中的节点集

c# - Entity Framework 5,从代码优先切换到数据库优先?

java - 如何编写具有泛型类类型的 java 方法?

hadoop - 映射器顺序执行而不是并行执行