按约束过滤

时间:2014-07-16 06:58:56

标签: f# type-constraints

好的,我意识到这可能是一个奇怪的问题。但无论如何我还是要问它。它如下:

假设我有以下内容:

type Foo() =
    member this.MyFooFun i = 2*i

type Bar() =
    inherit Foo()
    member this.MyBarFun i = 3*i

type Baz() =
    inherit Foo()
    member this.MyBazFun i = 5*i

type FooSeq = seq<Foo>

我想要做的是从具有成员MyBarFun的FooSeq过滤掉所有Foo。有可能做那样的事吗?

我意识到我可能不得不使用:?运算符来检查每个元素是否为Bar,但正如我所说 - 我不得不问。我不愿意这样做的原因是,FooBarBaz对应的类型位于公司其他地方开发的库中。并且可能会在任何给定时间添加更多包含MyBarFun成员的类型。

1 个答案:

答案 0 :(得分:2)

如果您只想对子类型进行过滤,则很容易:

let foos = candidates |> Seq.filter (fun x -> not (x :? Bar))

如果您明确要过滤掉具有名为“MyBarFun”成员的类型,则需要使用反射:

let foos' =
    candidates
    |> Seq.filter (fun x ->
        not (x.GetType().GetMembers() |> Array.exists (fun m ->
            m.Name = "MyBarFun")))