我想创建一个匿名函数,它接受一个源并允许我指定一个目标,我遇到了一些问题。它抱怨我的目的地是“类型”,这是有道理的,但我不知道如何解决它。
这是功能:
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。
我在这里做错了什么?
答案 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());