加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 03:43:00 所属栏目:百科 来源:网络整理
导读:我需要一个对象来在我的应用程序中对象映射器.我已经尝试了一些,但是没有找到符合我需要的任何东西,所以我正在写我自己的.目前我有一个如下的界面: public interface IMapperT,R { T Map(R obj);} 然后我实施一个将客户映射到帐户的AccountMapper: public
我需要一个对象来在我的应用程序中对象映射器.我已经尝试了一些,但是没有找到符合我需要的任何东西,所以我正在写我自己的.目前我有一个如下的界面:
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而不是写自己的.映射中有很多细微差别已经解决了,更不用说通过大量的性能测试,错误修复等.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读