我有这段代码:
public IEnumerable<IViewModel> MapRowsToModels(Type viewType, IEnumerable<dynamic> rows)
{
return rows.Select(row =>
{
var a = MapRowToModel(viewType, row); // a is of type dynamic, why!!!?
return a;
});
}
public abstract IViewModel MapRowToModel(Type viewType, dynamic row);
因此,我们有一个动态列表,我可以对其进行迭代,然后使用Select
转换为另一种类型,我可以为其实现。我的问题完全是关于那条线的:
var a = MapRowToModel(viewType, row); // a is of type dynamic, why?
这不会编译,我将鼠标悬停在a上,它显示a是动态类型的。为什么?我的方法返回一个IViewModel类型,为什么该类型是动态的?
答案 0 :(得分:3)
如docs所示,
大多数动态操作的结果本身就是
dynamic
。
为了将dynamic
强制转换为另一种类型,您应该使用隐式或显式强制转换,例如:
IViewModel a = MapRowToModel(viewType, row);
或
var a = (IViewModel)MapRowToModel(viewType, row);
答案 1 :(得分:1)
通过将MapRowsToModels
设为通用函数,可以获得所需的结果。
在T
上没有任何限制,它的行为将与您在IEnumerable<dynamic>
中的期望类似,并且将从MapRowToModel
获得所需的动态行为
public IEnumerable<IViewModel> MapRowsToModels<T>(Type viewType, IEnumerable<T> rows)
{
return rows.Select(row =>
{
var a = MapRowToModel(viewType, row);
return a;
});
}
public abstract IViewModel MapRowToModel(Type viewType, dynamic row);