F#でパラメータタイプによってオーバーロードされたメソッドを呼び出す方法は?

マーク・パティソン

ジェネリックパラメーターに従って、パラメータータイプによってオーバーロードされたメソッド(C#ライブラリから)を呼び出すのに苦労しています

次の例では、ポイントを説明するために、代わりにオーバーロードされたメソッドを持つF#クラスを使用しました。ジェネリックパラメーターがastructまたは参照型のいずれかであり、関連するパラメーター型の1つの派生型であることが重要です(StreamWriterここではそれを説明するために使用しました)。

open System.IO

type MyClass() =
    member this.Method(n: int) = sprintf "Integer %i" n
    member this.Method(s: string) = sprintf "String %s" s
    member this.Method(w: TextWriter) = sprintf "Some kind of text writer"

let passValueToCorrectMethod (c: MyClass) (value: 'a) : string =
    match value with
    | :? int as n -> c.Method(n) // ERROR: Runtime type tests are not allowed on some types
    | :? string as s -> c.Method(s)
    | :? TextWriter as w -> c.Method(w)

// what I want to be able to do with it
let c = MyClass()
let sw = new StreamWriter("C:\temp\blah")

let result1 = passValueToCorrectMethod c 5
let result2 = passValueToCorrectMethod c "hi"
let result3 = passValueToCorrectMethod c sw
CaringDev

(@Charles Magerによって提案されているように)に変更value: 'avalue: obj、オプションでキャッチオールケースを追加できます_ -> failwith "No overload"または、リフレクションを使用する場合:

let passValueToCorrectMethod (c: MyClass) (value: 'a) : string =
    let valueType = typeof<'a>
    let mi = c.GetType().GetMethod("Method", BindingFlags.Instance ||| BindingFlags.Public, null, [| valueType |], null)
    if isNull mi then
        failwithf "No overload for %s" valueType.Name
    else    
        mi.Invoke(c, [| value |]) |> string

// what you'll be able to do with it
let c = MyClass()
let sw = new StreamWriter(".\\temp.txt")

passValueToCorrectMethod c sw // Some kind of text writer
passValueToCorrectMethod c () // Runtime Exception: No overload for Unit

このようにMethod、を変更せずにsを追加/削除するときに機能passValueToCorrectMethodます。とにかく、コンパイル時の安全性が失われます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

オーバーライドされたメソッドの計算式からベースF#メソッドを呼び出す方法は?

分類Dev

スーパーコンストラクターで呼び出されるオーバーライドメソッドにメンバーを使用する方法

分類Dev

nullパラメータで呼び出された場所に応じて、異なるオーバーロードメソッドが選択されます

分類Dev

Swiftがオーバーロードされたメソッドをより具体的なタイプで呼び出さないのはなぜですか?

分類Dev

nullパラメータを持つオーバーロードされたメソッドを呼び出すことは良い習慣ですか?

分類Dev

Javascriptオブジェクトに「グローバル」ゲッター/セッターメソッドを定義して、プロパティが取得/設定されるたびに呼び出されるようにすることは可能ですか?

分類Dev

varargsパラメーターを指定してオーバーロードされたメソッドを呼び出すときのNashornのバグ

分類Dev

F#からパラメーターを指定せずにC#オーバーロードメソッドを呼び出す

分類Dev

Javaラッパー:スーパーコンストラクターで呼び出されたメソッドをオーバーライドします

分類Dev

オーバーライドされたメソッド内で元のメソッドを呼び出す方法

分類Dev

ジェネリック型パラメーターを持つメソッドと非ジェネリックパラメーターを持つメソッドがある場合、Javaはどのオーバーロードされたメソッドを呼び出すかをどのように決定しますか?

分類Dev

Revealing PrototypePatternを使用してオーバーライドされたメソッドを内部的に呼び出す方法

分類Dev

F#からオーバーロードされたC#メソッドを呼び出す

分類Dev

F#からオーバーロードされたC#メソッドを呼び出す

分類Dev

F#でメンバーメソッドを呼び出すタイマーを設定するにはどうすればよいですか?

分類Dev

[Selenium] Web要素でオーバーライドされたメソッドを呼び出す方法は?

分類Dev

addCookieメソッドは「非Cookieパラメータで呼び出されたaddCookie」をスローします

分類Dev

AngularのngOnInitでパラメーター化されたメソッドを呼び出す方法は?

分類Dev

オーバーライドされたメソッドのベースメソッドをオーバーライドされたメソッドから強制的に呼び出すにはどうすればよいですか?

分類Dev

OOP(PHP)-オーバーライドされたメソッドに親メソッドに従って呼び出すように強制します

分類Dev

null不可能なパラメータを受け入れるオーバーロードされたKotlinメソッドへのJava呼び出しを強制するにはどうすればよいですか?

分類Dev

パラメータとして指定されたC ++クラスメソッドを呼び出す方法は?

分類Dev

サブクラスでオーバーライドされたメソッドを呼び出す方法は?リファクタリングの潜在的な候補

分類Dev

コンストラクター内で別のメソッドを呼び出すことによって作成されたビットマップオブジェクトにプロパティを追加する

分類Dev

Javaでパラメータ化されたメソッドを呼び出す方法は?

分類Dev

渡されたパラメータを他のメソッド呼び出しで使用する方法は?

分類Dev

ベクターへのポインタによって呼び出されたメソッドはオブジェクトを変更できません

分類Dev

EmberCLIによって構築されたEmberJSで、さまざまなコントローラーのメソッドを呼び出す方法は?

分類Dev

Springで@Validパラメータを使用して@RequestMethodメソッドで実行される同じバリデータをプログラムで呼び出すにはどうすればよいですか?

Related 関連記事

  1. 1

    オーバーライドされたメソッドの計算式からベースF#メソッドを呼び出す方法は?

  2. 2

    スーパーコンストラクターで呼び出されるオーバーライドメソッドにメンバーを使用する方法

  3. 3

    nullパラメータで呼び出された場所に応じて、異なるオーバーロードメソッドが選択されます

  4. 4

    Swiftがオーバーロードされたメソッドをより具体的なタイプで呼び出さないのはなぜですか?

  5. 5

    nullパラメータを持つオーバーロードされたメソッドを呼び出すことは良い習慣ですか?

  6. 6

    Javascriptオブジェクトに「グローバル」ゲッター/セッターメソッドを定義して、プロパティが取得/設定されるたびに呼び出されるようにすることは可能ですか?

  7. 7

    varargsパラメーターを指定してオーバーロードされたメソッドを呼び出すときのNashornのバグ

  8. 8

    F#からパラメーターを指定せずにC#オーバーロードメソッドを呼び出す

  9. 9

    Javaラッパー:スーパーコンストラクターで呼び出されたメソッドをオーバーライドします

  10. 10

    オーバーライドされたメソッド内で元のメソッドを呼び出す方法

  11. 11

    ジェネリック型パラメーターを持つメソッドと非ジェネリックパラメーターを持つメソッドがある場合、Javaはどのオーバーロードされたメソッドを呼び出すかをどのように決定しますか?

  12. 12

    Revealing PrototypePatternを使用してオーバーライドされたメソッドを内部的に呼び出す方法

  13. 13

    F#からオーバーロードされたC#メソッドを呼び出す

  14. 14

    F#からオーバーロードされたC#メソッドを呼び出す

  15. 15

    F#でメンバーメソッドを呼び出すタイマーを設定するにはどうすればよいですか?

  16. 16

    [Selenium] Web要素でオーバーライドされたメソッドを呼び出す方法は?

  17. 17

    addCookieメソッドは「非Cookieパラメータで呼び出されたaddCookie」をスローします

  18. 18

    AngularのngOnInitでパラメーター化されたメソッドを呼び出す方法は?

  19. 19

    オーバーライドされたメソッドのベースメソッドをオーバーライドされたメソッドから強制的に呼び出すにはどうすればよいですか?

  20. 20

    OOP(PHP)-オーバーライドされたメソッドに親メソッドに従って呼び出すように強制します

  21. 21

    null不可能なパラメータを受け入れるオーバーロードされたKotlinメソッドへのJava呼び出しを強制するにはどうすればよいですか?

  22. 22

    パラメータとして指定されたC ++クラスメソッドを呼び出す方法は?

  23. 23

    サブクラスでオーバーライドされたメソッドを呼び出す方法は?リファクタリングの潜在的な候補

  24. 24

    コンストラクター内で別のメソッドを呼び出すことによって作成されたビットマップオブジェクトにプロパティを追加する

  25. 25

    Javaでパラメータ化されたメソッドを呼び出す方法は?

  26. 26

    渡されたパラメータを他のメソッド呼び出しで使用する方法は?

  27. 27

    ベクターへのポインタによって呼び出されたメソッドはオブジェクトを変更できません

  28. 28

    EmberCLIによって構築されたEmberJSで、さまざまなコントローラーのメソッドを呼び出す方法は?

  29. 29

    Springで@Validパラメータを使用して@RequestMethodメソッドで実行される同じバリデータをプログラムで呼び出すにはどうすればよいですか?

ホットタグ

アーカイブ