【发布时间】:2009-11-24 18:20:44
【问题描述】:
我喜欢防御性编程。 我讨厌抛出异常,但这不是我的问题。
我对 linQ 进行了扩展,以便能够使用列名执行订单
public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> list, string sortExpression)
使用防御性编程,如果列名无效,此方法将返回给定的枚举。
现在我需要使用 ThenBy 执行 二次排序。 所以我需要那个签名:
public static IOrderedEnumerable<T> OrderBy<T>(this IEnumerable<T> list, string sortExpression)
我需要返回一个 IOrderedEnumerable。 我的问题是保留我的防御性编程功能:我必须返回给定的集合是列名无效。
有没有一种干净的方法来做到这一点?我在想的只是一些技巧:
- 使用反射按找到的第一个属性排序,这是有风险的,因为该属性可能不允许排序
- 实现我自己的 IOrderedEnumerable,这也有风险,因为我在 IQueryable 或 IList 上执行排序,然后执行其他 LinQ 操作,所以我担心副作用。
还有意见/建议? 谢谢
【问题讨论】:
-
如何返回与所要求的内容无关的输出,其被要求的方式比引发异常更具防御性,在特定层捕获它,以适合的方式显示它程序的类型,然后更确信其他代码没有引入错误,假设订购可枚举的方法订购可枚举?这似乎与防御性编程完全相反。
标签: linq defensive-programming iorderedenumerable