具有匿名和动态类型抛出错误的方法

时间:2013-07-17 11:42:46

标签: c# dependency-injection ienumerable

以下代码循环遍历resultSet并填充SomeType的列表a。 resultSet本身是一个具有两个属性的匿名类型

var resultSet = SomeCollection.Select(x => new {
    FirstProp = x,
    SomeMembers = SomeLinkCollection.Where(l => l.SomeId == x.SomeId)
                                    .Select(l => AnotherCollection[l.Id])
});

var result = new List<SomeType>();
foreach (var currentGroup in resultSet) {
    result.Add(new SomeType {
        Prop1 = currentGroup.Item.Id,
        Prop2 = currentGroup.Item.Name,
        Prop3 = currentGroup.SomeMembers.OrderBy(x => x.Name)
    });
}

要删除设置新的Sometype个实例,我使用动态类型创建了一个mapper类/接口来分割责任并使用依赖注入:

public class SomeMapper : ISomeMapper {
    public List<SomeType> Map(dynamic resultSet) {
        return resultSet.Select(new SomeType {
            Prop1 = currentGroup.Item.Id,
            Prop2 = currentGroup.Item.Name,
            Prop3 = ((IEnumerable<AnotherType>)resultSet.SomeMembers)
                                                .OrderBy(x => x.Name)
        });
    }
}

所以上面的代码变成了:

return resultSet.Select(SomeMapper.Map);

错误

  

无法隐式转换类型   'System.Collections.Generic.IEnumerable&GT;'   到'System.Collections.Generic.List'。显式转换   存在(你是否错过演员表?)

我尝试使用显式转换为SomeType的一些技巧,但它在运行时失败

return (List<SomeType>)groupSet.Select(statusGroupMapper.Map);
  

无法施放类型为
的物体   'WhereSelectListIterator 2[AnotherType,System.Collections.Generic.List 1 [SOMETYPE]]'   输入'System.Collections.Generic.List`1 [SomeType]'。

1 个答案:

答案 0 :(得分:3)

您需要创建结果列表。

只需在表达式后添加.ToList()

public class SomeMapper : ISomeMapper {
    public List<SomeType> Map(dynamic resultSet) {
        return resultSet.Select(new SomeType {
            Prop1 = currentGroup.Item.Id,
            Prop2 = currentGroup.Item.Name,
            Prop3 = ((IEnumerable<AnotherType>)resultSet.SomeMembers).OrderBy(x => x.Name)
        }).ToList();
    }
}

.Select(...)会返回IEnumerable<T>,而不是List<T>,所以这与此方法的问题完全相同:

public string Name()
{
    return 10; // int
}

调用它时也会出现问题,请勿执行此操作:

return (List<SomeType>)groupSet.Select(statusGroupMapper.Map);

这样做:

return statusGroupMapper.Map(groupSet);