【问题标题】:Make .NET Delegates (for filtering and ordering) 'trustable'使 .NET 委托(用于过滤和排序)“可信任”
【发布时间】:2011-07-04 19:51:03
【问题描述】:

使 Linq Where 和 OrderBy 方法中使用的 Delegates 变得“可信”的最佳方法是什么?

例如,如果我的代码被传递这些类型 Func<T,Boolean>Func<T>,那么最好的选择是检查它们是否只会对传递给它们的对象进行操作,而不是,例如,做讨厌的事情诸如访问文件系统之类的事情?

我想一种方法是启动一个部分受信任的 AppDomain,并且委托在其中运行,但我想知道是否还有其他选择?

谢谢

【问题讨论】:

    标签: .net delegates trust


    【解决方案1】:

    一种选择是使用Expression<Func<...>> 而不是Func<...>,然后您只需遍历树(来自x => x.Foo 等)并验证使用了哪些对象和方法 - 但您必须限制您的 对象,显然即使.Foo 也可能是恶意的。这里的优点是 对于调用者,它的外观和感觉与将委托作为 lambda 传递相同。

    一种更简单的方法可能是让他们将您用于排序/过滤/等的字符串(名称)或枚举传递给您。

    【讨论】:

    • 当然这仅适用于表达式,不适用于语句 lamdas。
    • @CodeInChaos - 仍然很遗憾编译器不会在 4.0 中编写 Expression.Block
    • @Marc 我同意。很遗憾,当他们在 .net 4 中引入这些新的表达式类型时,他们并没有改进他们的 lamda 到表达式的转换器。
    • @CodeInChaos - 当然技术上从未定义过表达式转换器(它不是语言规范的一部分),因此您可以做的事情非常随意: )
    • 这种方法的一个缺点是它对性能有很大影响(分析和编译表达式)
    猜你喜欢
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多