使用AutoMapper的匿名函数

时间:2016-06-02 21:12:46

标签: c# generics

我想创建一个匿名函数,它接受一个源并允许我指定一个目标,我遇到了一些问题。它抱怨我的目的地是“类型”,这是有道理的,但我不知道如何解决它。

这是功能:

    public TDest ReadService<TSrc,TDest>(Func<IWebApiServiceResponse<TSrc>> func, TDest dest)
    {
        // i will be doing other functionality in here, error logging, etc
        return Mapper.Map(func(), dest);
    }

以下是我如何称呼它:

var data = ReadService(() => Services.CServices.CUsers(), typeof(CustomViewModel));

我希望数据类型为CustomViewModel。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

/ p>

var data = ReadService(() => Services.CServices.CUsers(), new CustomViewModel());

或让AutoMapper为您创建一个:

public TDest ReadService<TSrc,TDest>(Func<IWebApiServiceResponse<TSrc>> func)
{
    // i will be doing other functionality in here, error logging, etc
    return Mapper.Map<IWebApiServiceResponse<TSrc>, TDest>(func());
}

但请注意,无法从返回类型推断泛型参数,因此在调用方法时必须指定它:

var data = ReadService<CUser,CustomViewModel>(() => Services.CServices.CUsers());

答案 1 :(得分:1)

我认为你在这里混淆了一些概念:

当您拨打电话ReadService(() => Services.CServices.CUsers(), typeof(CustomViewModel))时,通用类型TDest将为System.Type,因为那是typeof返回的内容。

因此ReadService的返回类型为System.Type,您尝试从IWebApiServiceResponse<...>映射到System.Type,而不是CustomViewModel

要解决此问题,您可以执行以下操作:

public TDest ReadService<TSrc, TDest>(Func<IWebApiServiceResponse<TSrc>> func)
{
    var type = typeof(TDest); //If you need the System.Type of TDest

    ...
    return Mapper.Map<TDest>(func());
}

var data = ReadService</*source type*/, CustomViewModel>(() => Services.CServices.CUsers());