我需要在我的应用程序中使用对象到对象映射器。我已经尝试了一些,但无法找到适合我需要的任何东西,所以我正在编写自己的。目前我有一个如下界面:
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
}
}
虽然第一个实现工作正常,但第二个会稍微优雅一些。这可能吗?如果可以,正确的语法会是什么样子?
编辑 - - - -
我讨厌人们这样做,但我当然忘了提一个小细节。我们在映射器和接口之间有一个抽象类,用于在所有映射器中实现一些通用逻辑。所以我的映射器签名实际上是:
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));
}
}