C# · 12月 29, 2021

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

我需要一个对象来在我的应用程序中对象映射器.我已经尝试了一些,但是没有找到符合我需要的任何东西,所以我正在写我自己的.目前我有一个如下的界面: public interface IMapper<T,R> { T Map(R obj);}

然后我实施一个将客户映射到帐户的AccountMapper:

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

这到目前为止工作正常,但是我有几个源实体映射到同一个目标实体.例如,我有一个付款和发票,都映射到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 }}

虽然第一次实施工作正常,但第二次将稍微优雅.这是否可能,正确的语法会是什么样子?

编辑 – – – –

我讨厌当人们这样做,但当然我忘了提一点细节.我们在映射器和接口之间有一个抽象类,以实现所有映射器的一些常见逻辑.所以我的mapper签名实际上是:

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)); }}@H_403_25@解决方法 您将不得不使用您的第一个界面并在对象上多次实现界面: public class BillHistoryMapper : IMapper<Account,Invoice>,IMapper<Account,Payment> { …}

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