gpt4 book ai didi

c# - 为什么 Select() 不将 IEnumerable 转换为 IEnumerable

转载 作者:太空狗 更新时间:2023-10-29 22:28:12 26 4
gpt4 key购买 nike

我只是尝试使用 Dapper 将我的数据库表映射到 C# 中的类型,但是,我的某些类型需要表中没有的其他元素。为此,我使用了一个可以获取列值并设置适当属性的工厂。

public IEnumerable<IMyType> All() {
var query = _connection.Query("SELECT * FROM [table]");
return query.Select(o => _myTypeFactory.Create(o));
}

目前这导致 return 语句产生错误:

无法转换表达式类型 'System.Collections.Generic.IEnumerable<dynamic>'返回类型 'System.Collections.Generic.IEnumerable<IMyType>'

我的工厂类看起来像这样:

public class MyTypeFactory {
public IMyType Create(dynamic o) {
return Create((String) o.Code, (Int32) o.KeyID);
}
public IMyType Create(String code, Int32 keyID) {
return new MyType(code, Cache.Lookup(keyID));
}
}

为什么 Select() 没有方法返回 IEnumerable<IMyType> ?我需要做什么才能完成这项工作?这是错误的方法吗?还有更好的方法吗?

最佳答案

最简单的修复方法就是使用 Cast<> LINQ 运算符:

public IEnumerable<IMyType> All() {
var query = _connection.Query("SELECT * FROM [table]");
return query.Select(o => _myTypeFactory.Create(o))
.Cast<IMyType>();
}

或者,您可以转换每个元素:

public IEnumerable<IMyType> All() {
var query = _connection.Query("SELECT * FROM [table]");
return query.Select(o => (IMyType) _myTypeFactory.Create(o));
}

它目前不起作用,因为在 IEnumerable<dynamic> 之间根本没有可用的隐式转换和 IEnumerable<IMyType> . IEnumerable<dynamic>可以通过多种方式实现,并且鉴于每个项目都将动态生成,没有理由假设结果值将实现 IEnumerable<IMyType> .

我同意第二种形式看起来实际上并没有添加任何东西,但是编译器没有检查所有可能 _myTypeFactory.Create(o) 的返回类型- 它将整个表达式视为动态值,即表达式的类型为 dynamic .因此 Select结果仍然是 IEnumerable<dynamic> 类型.

另一种选择是将通用类型参数指定为 Select .

public IEnumerable<IMyType> All() {
var query = _connection.Query("SELECT * FROM [table]");
return query.Select<IMyType>(o => _myTypeFactory.Create(o));
}

这是试图将 lambda 表达式强制为 Func<dynamic, IMyType> - 我相信会奏效...

编辑:如评论中所述,强制在编译时解析方法调用也将修复它。基本上,这取决于您认为最易读的内容。

关于c# - 为什么 Select() 不将 IEnumerable<dynamic> 转换为 IEnumerable<StrongType>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7247757/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com