创建具有无限表达式参数的方法

本文关键字:参数 方法 表达式 无限 创建 | 更新日期: 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来代替泛型