我正在尝试使用Dapper将我的数据库表映射到C#中的类型,但是有些类型需要额外的元素,而这些元素并不在表中。为了实现这一点,我正在使用一个工厂,可以接受列值并设置适当的属性。
public IEnumerable<IMyType> All() {
var query = _connection.Query("SELECT * FROM [table]");
return query.Select(o => _myTypeFactory.Create(o));
}
目前这会导致返回语句产生错误:
无法将表达式类型'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>
?我需要做什么才能让它工作?这是错误的方法吗?是否有更好的方法?
IMyType
的强制转换视为红色干鱼,实际上在这种情况下您不需要动态调用MyTypeFactory.Create(dynamic o)
。您只需要访问在Create
内部完成的属性即可。 - jbtuleCreate
被动态调用,但在运行时没有什么新的发现,显然这不是问题的意图。将接口强制转换可以使代码工作,但如果意图不是动态行为,这是否有意义? - jbtuleCreate
被动态调用没有特别的好处 - 除非OP发现这是众多解决方案中最易读的。当然,使所有这些 less dynamic 会稍微更有效率,但我认为可读性是更重要的目标。留下动态的 Create 调用可能会允许以后有更易读的 Create 调用(更多的重载)。基本上在这里有大量的选择 :) - Jon Skeet