使用无限表达式参数创建方法?

时间:2011-08-25 14:21:53

标签: c# lambda

我创建了一个具有以下签名的存储库方法:

T Get<TProperty>(int id, Expression<Func<T, TProperty>> include)

这样可以正常工作,但我想扩展它以包含无限数量的包含。我不能简单地使用params,因为每个include都将返回不同的TProperty。

有没有一个很好的解决方法或者我必须为1,2或3包含多个重载?例如?

2 个答案:

答案 0 :(得分:1)

如果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是返回类型的协方差,这意味着如果您的委托期望返回对象,您仍然可以向其传递具有较窄返回类型的委托(尽管警告,协方差值类型不与covariance兼容)对象,仅引用类型)。

答案 1 :(得分:0)

您发布的代码不允许您返回其他TProperty,只允许您在运行时指定的类型为<TProperty>

您可以使用Params并使用Object而不是泛型