我创建了一个具有以下签名的存储库方法:
T Get<TProperty>(int id, Expression<Func<T, TProperty>> include)
这样可以正常工作,但我想扩展它以包含无限数量的包含。我不能简单地使用params,因为每个include都将返回不同的TProperty。
有没有一个很好的解决方法或者我必须为1,2或3包含多个重载?例如?
答案 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而不是泛型