Фильтровать по ограничению

Хорошо, я понимаю, что это может быть странный вопрос. Но мне все равно нужно спросить. Это происходит следующим образом:

Предположим, у меня есть что-то вроде следующего:

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>

Что я хочу сделать, так это отфильтровать все Foo из FooSeq, в котором есть член MyBarFun. Можно ли сделать что-нибудь подобное?

Я понимаю, что мне, вероятно, придется использовать оператор :?, чтобы проверить, является ли каждый элемент Bar, но, как я уже сказал, я должен спросить. Причина, по которой я бы предпочел этого не делать, заключается в том, что типы, соответствующие Foo, Bar и Baz, лежат в библиотеке, разработанной где-то еще в компании. И в любой момент времени могут быть добавлены дополнительные типы, содержащие член MyBarFun.


person torbonde    schedule 16.07.2014    source источник
comment
Ваша жизнь была бы проще, если бы все подтипы с MyBarFun могли быть через промежуточный тип или реализовывать интерфейс, такой как IMyBarFun.   -  person Mark Pattison    schedule 16.07.2014
comment
Связано: stackoverflow.com/q/2521254/126014   -  person Mark Seemann    schedule 16.07.2014
comment
Пожалуйста, сообщите нам некоторые подробности о реальной проблеме, которую вы пытаетесь решить. Хотя люди могут найти прямой ответ на ваш вопрос, вполне возможно, что, зная общую картину, вся проблема получит хорошее и простое решение.   -  person bytebuster    schedule 16.07.2014


Ответы (1)


Если вы хотите фильтровать только по подтипу, это легко:

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")))
person Mark Seemann    schedule 16.07.2014
comment
Я хочу отфильтровать типы, у которых есть член с именем MyBarFun (чтобы остались только они). И затем я хочу вызвать их с помощью Seq.map. Как я и ожидал, мне придется делать это с помощью отражения, поскольку MyBarFun не абстрагируется в интерфейс. Спасибо.:) - person torbonde; 16.07.2014