У меня есть потребность в объекте для сопоставления объектов в моем приложении. Я опробовал несколько, но не смог найти ничего, что бы соответствовало моим потребностям, поэтому я пишу свое. В настоящее время у меня есть интерфейс, как показано ниже:
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));
}
}