LINQ-动态选择-隐式转换错误-意外类型

时间:2019-04-19 15:36:08

标签: c# linq generics

我有这段代码:

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类型,为什么该类型是动态的?

2 个答案:

答案 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);
相关问题