微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于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));
    }
}

解决方法

您将不得不使用您的第一个界面并在对象上多次实现界面:
public class BillHistoryMapper : IMapper<Account,Invoice>,IMapper<Account,Payment> {     
   ...
}

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

原文地址:https://www.jb51.cc/csharp/93968.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐