好的,我意识到这可能是一个奇怪的问题。但无论如何我还是要问它。它如下:
假设我有以下内容:
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
,但正如我所说 - 我不得不问。我不愿意这样做的原因是,Foo
,Bar
和Baz
对应的类型位于公司其他地方开发的库中。并且可能会在任何给定时间添加更多包含MyBarFun
成员的类型。
答案 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")))