创建具有无限表达式参数的方法
本文关键字:参数 方法 表达式 无限 创建 | 更新日期: 2023-09-27 18:06:43
我已经创建了一个具有以下签名的存储库方法:
T Get<TProperty>(int id, Expression<Func<T, TProperty>> include)
这工作得很好,但我想扩展它以容纳无限数量的包含。我不能简单地使用params,因为每个include都会返回一个不同的TProperty。
是否有一个很好的方法来解决这个问题,或者我是否必须为1、2或3个包含创建几个重载?
如果TProperty类型可以是不同的,并且如果您想让它们成为不同的类型,那么您将需要多次重载。
T Get<TProperty>(int id, Expression<Func<T, TProperty>> include) { ... }
T Get<TProperty1, TProperty2>(int id, Expression<Func<T, TProperty1>> include1, Expression<Func<T, TProperty2>> include2)
或您可以使用:
T Get(int id, params Expression<Func<T, object>>[] includes)
并依赖于Func泛型委托的协方差,但这样你就必须处理这样一个事实:你失去了一点类型安全。
因为Func是返回类型的协方差,这意味着如果你的委托期望返回对象,你仍然可以传递给它一个具有更窄返回类型的委托(尽管警告,协方差值类型与对象不协方差兼容,只能与引用类型兼容)。
您发布的代码将不允许您返回不同的TProperty,而只允许您在运行时指定的类型为<TProperty>
可以使用Params和Object来代替泛型