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

Bri*_*ian 13 c# generics mapper

我需要一个对象来在我的应用程序中对象映射器.我试过了一些,但是找不到符合我需要的东西,所以我自己写的.目前我有一个如下界面:

public interface IMapper<T, R> {
    T Map(R obj);
}
Run Code Online (Sandbox Code Playgroud)

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

public class AccountMapper : IMapper<Account, Customer> {
    Account Map(Customer obj) {
        // mapping code
    }
}
Run Code Online (Sandbox Code Playgroud)

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

虽然第一个实现工作正常,但第二个实现更优雅.这是可能的,如果是这样,正确的语法是什么样的?

编辑 - - - -

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

public class BillHistoryMapper : Mapper<BillHistory, Invoice> {
}
Run Code Online (Sandbox Code Playgroud)

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ser 4

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

public class BillHistoryMapper : IMapper<Account, Invoice>, 
                                 IMapper<Account, Payment> {     
   ...
}
Run Code Online (Sandbox Code Playgroud)

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