ホームページ  >  記事  >  バックエンド開発  >  リフレクションを使用して型パラメータを抽出する方法

リフレクションを使用して型パラメータを抽出する方法

王林
王林転載
2024-02-12 17:24:05578ブラウズ

リフレクションを使用して型パラメータを抽出する方法

質問の内容

コンテキスト: 2 種類の構造体を受け取り、その構造体の各フィールドに指定されたタグがあるかどうかを確認し、コピーする汎用オートマッパーを作成しています。タグと型が一致していると仮定して、ソース構造からターゲット構造への値。構造体フィールドが別の (ネストされた) 構造体である場合は常に、オートマッパー関数でウサギの穴を自動的にマッピングする再帰呼び出しを実行する必要があります。

問題: ルート構造の具象型のみを渡すことができます。リフレクションを使用してジェネリック関数に入ると、ネストされた構造体型を抽出しようとすることは不可能に思えます。 value.interface() をパラメータとして渡すことはできますが、type パラメータを渡す必要があります。

これは、問題を示すための簡略化されたコードです。

type Alpha struct {
    Nested Beta `automap:"nested"`
}

type Beta struct {
    Info string `automap:"info"`
}

type Foo struct {
    Nested Bar `automap:"nested"`
}

type Bar struct {
    Info string `automap:"info"`
}

func TestAutoMap(t *testing.T) {

    b := Beta{Info: "Hello from Beta!"}
    a := Alpha{Nested: b}

    f, err := AutoMap[Alpha, Foo](a)
    if err != nil {
        fmt.Println(err)
        t.Fail()
    }
    fmt.Println("f.nested.info:", f.Nested.Info)
}

func AutoMap[S, T any](source S) (target T, err error) {

    targetStruct := reflect.ValueOf(&target).Elem()
    sourceStruct := reflect.ValueOf(&source).Elem()

    // .Type and .Kind directly did not work.
    nestedSourceType := ??? // I want this to be type Beta.
    nestedTargetType := ??? // I want this to be type Bar.

    sourceInterface := sourceStruct.Interface()

    t, err := AutoMap[nestedSourceType, nestedTargetType](sourceInterface)
    if err != nil {
        return target, err
    }
    target = t

    return target, nil
}

解決策

@mkopriva のアドバイスに従って、私が遭遇した問題に対する簡単な解決策を共有したいと思います。 p>

自由に修正または改善してください。ただし、以下のさまざまなチェックやアサーションは意図的に含めていないことに注意してください。

(遊び場の例)

リーリー

以上がリフレクションを使用して型パラメータを抽出する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。