C#リフレクションにおけるジェネリックメソッドのあいまいさを解決する方法

Matti Jokipii

ジェネリック型パラメーターと引数型の数が異なる2つのジェネリックメソッドオーバーロードがあります

// Argument types
public class Bar<T> {}
public class Bar<T, U> {}

// Generic method overloads
private static void Foo<T> (Bar<T> b) {}
private static void Foo<T, U> (Bar<T, U> b) {}

適切な数の型パラメーターを使用することで、どちらのメソッド情報も取得できると思います。

BindingFlags Flags = BindingFlags.NonPublic | BindingFlags.Static;

// Should give Foo<int>
GetType ().GetMethod ("Foo", Flags).MakeGenericMethod (typeof(int));

// Should give Foo<int, int>
GetType ().GetMethod ("Foo", Flags | BindingFlags.Static).MakeGenericMethod (typeof(int), typeof(int));

ただし、これはSystem.Reflection.AmbiguousMatchExceptionで失敗します

いくつかのオーバーロードの引数new Type[] {typeof (Bar<,>)}としてなど指定しようとしましたが、結果は常にnullでした。関数に異なる名前を使用するだけであいまいさを回避できることはわかっていますが、これに対する実際の解決策があるかどうかを知りたいと思っています。typesGetMethod

.NET Standard 2.0、.NET Core2.0を使用しています

達人ストロン

あなたが使用しない場合Type.GetMethodsは、使用できる結果の上に及び反復これのオーバーロードをGetMethodし、Type.MakeGenericMethodParameter.NETのコア2.1から提供されています:

class MyClass
{
    // Argument types
    public class Bar<T> { }
    public class Bar<T, U> { }

    // Generic method overrides
    private static void Foo<T>(Bar<T> b) { }
    private static void Foo<T, U>(Bar<T, U> b) { }
}

typeof(MyClass)
    .GetMethod(
    "Foo",
    1,
    BindingFlags.NonPublic | BindingFlags.Static,
    null,
    new[] { Type.MakeGenericSignatureType(typeof(MyClass.Bar<>), Type.MakeGenericMethodParameter(0)) },
    null
); // First Foo

typeof(MyClass)
    .GetMethod(
    "Foo",
    2,
    BindingFlags.NonPublic | BindingFlags.Static,
    null,
    new[] { Type.MakeGenericSignatureType(typeof(MyClass.Bar<,>), Type.MakeGenericMethodParameter(0),Type.MakeGenericMethodParameter(1)) },
    null
); // Second Foo

UPD

Type.MakeGenericMethodParameter利用できないので、私が見る唯一のオプション(すべてのメソッドが同じジェネリック型argumetnsを持つジェネリッククラスの一部ではない場合)はGetMethods、結果を使用してフィルタリングすることです。この場合の最も単純なフィルターは、ジェネリックパラメーターの数です。

var secondMethod = typeof(MyClass).GetMethods(BindingFlags.NonPublic | BindingFlags.Static)
    .Where(mi => mi.Name == "Foo" && mi.GetGenericArguments().Length == 2)
    .First();

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

C#ジェネリックメソッドの解決があいまいな呼び出しエラーで失敗する

分類Dev

リフレクションまたはジェネリックを使用してジェネリックEntityFramework C#コードを標準化する方法は?

分類Dev

リフレクションを使用してジェネリックメソッドを見つけるときに、あいまいな一致が見つかりました

分類Dev

このC#メソッドをジェネリックにする方法は?

分類Dev

C#でジェネリック型である型のコレクションを作成する方法

分類Dev

ジェネリック拡張メソッドの解決に失敗する

分類Dev

C#ジェネリック:2つのコレクションに同じタイプが含まれている必要があるが、コレクションが同じタイプである必要がないジェネリックを宣言するにはどうすればよいですか?

分類Dev

基になるオブジェクトを変更しないJavaリフレクションネストされたメソッド

分類Dev

Javaリフレクション:メソッドのジェネリック型のクラスを取得する方法?

分類Dev

Javaのリフレクションによってジェネリックメソッドを呼び出す

分類Dev

Itへのすべてのタイプのコレクションを受け入れるジェネリックメソッドPrintを作成します

分類Dev

ジェネリックパラメーターを受け入れるメソッドにRawタイプのコレクションオブジェクトが渡されると、ジェネリックIterator <E>の動作が異なる

分類Dev

C#でリフレクションを使用してメソッドから呼び出されたメソッドのリストを取得する方法

分類Dev

C#リフレクションを使用して、ジェネリックListパラメーターで拡張メソッドを呼び出す方法は?

分類Dev

C#の正しい方法でジェネリックメソッドを実装する

分類Dev

ジェネリック型がAnyにバインドされている場合のkotlinオーバーロード解決のあいまいさ

分類Dev

リフレクションを使用してジェネリック戻り値の型でジェネリックメソッドを呼び出す方法

分類Dev

パラメータに渡された型に基づいて特定のコレクションであるジェネリック型を返す

分類Dev

ジェネリッククラスのJava 8のあいまいなメソッドリファレンス

分類Dev

C#でジェネリックメソッドの値を取得する方法

分類Dev

Java:あいまいさをオーバーロードするジェネリックメソッド

分類Dev

ジェネリックメソッドの過負荷解決が期待どおりに機能しない

分類Dev

特定のAzureテーブルのパーティションをクエリするためにc#でジェネリックメソッドを構築するにはどうすればよいですか?

分類Dev

C#ジェネリックメソッドタイプでDllImportを使用する方法はありますか?

分類Dev

制約されたジェネリック型を持つアクションデリゲートをC#のタイプセーフコレクションに格納するにはどうすればよいですか?

分類Dev

強く型付けされたリフレクションを使用して、ジェネリックパラメーターを持つメソッドを見つけることはできますか?

分類Dev

ジェネリックメソッドの実装におけるさまざまな戻り値の型

分類Dev

メソッドをインターフェースでジェネリックにするか、必要な数だけ持ってください

分類Dev

メソッドにリンクされたジェネリック型のTRTTITypeを取得する方法

Related 関連記事

  1. 1

    C#ジェネリックメソッドの解決があいまいな呼び出しエラーで失敗する

  2. 2

    リフレクションまたはジェネリックを使用してジェネリックEntityFramework C#コードを標準化する方法は?

  3. 3

    リフレクションを使用してジェネリックメソッドを見つけるときに、あいまいな一致が見つかりました

  4. 4

    このC#メソッドをジェネリックにする方法は?

  5. 5

    C#でジェネリック型である型のコレクションを作成する方法

  6. 6

    ジェネリック拡張メソッドの解決に失敗する

  7. 7

    C#ジェネリック:2つのコレクションに同じタイプが含まれている必要があるが、コレクションが同じタイプである必要がないジェネリックを宣言するにはどうすればよいですか?

  8. 8

    基になるオブジェクトを変更しないJavaリフレクションネストされたメソッド

  9. 9

    Javaリフレクション:メソッドのジェネリック型のクラスを取得する方法?

  10. 10

    Javaのリフレクションによってジェネリックメソッドを呼び出す

  11. 11

    Itへのすべてのタイプのコレクションを受け入れるジェネリックメソッドPrintを作成します

  12. 12

    ジェネリックパラメーターを受け入れるメソッドにRawタイプのコレクションオブジェクトが渡されると、ジェネリックIterator <E>の動作が異なる

  13. 13

    C#でリフレクションを使用してメソッドから呼び出されたメソッドのリストを取得する方法

  14. 14

    C#リフレクションを使用して、ジェネリックListパラメーターで拡張メソッドを呼び出す方法は?

  15. 15

    C#の正しい方法でジェネリックメソッドを実装する

  16. 16

    ジェネリック型がAnyにバインドされている場合のkotlinオーバーロード解決のあいまいさ

  17. 17

    リフレクションを使用してジェネリック戻り値の型でジェネリックメソッドを呼び出す方法

  18. 18

    パラメータに渡された型に基づいて特定のコレクションであるジェネリック型を返す

  19. 19

    ジェネリッククラスのJava 8のあいまいなメソッドリファレンス

  20. 20

    C#でジェネリックメソッドの値を取得する方法

  21. 21

    Java:あいまいさをオーバーロードするジェネリックメソッド

  22. 22

    ジェネリックメソッドの過負荷解決が期待どおりに機能しない

  23. 23

    特定のAzureテーブルのパーティションをクエリするためにc#でジェネリックメソッドを構築するにはどうすればよいですか?

  24. 24

    C#ジェネリックメソッドタイプでDllImportを使用する方法はありますか?

  25. 25

    制約されたジェネリック型を持つアクションデリゲートをC#のタイプセーフコレクションに格納するにはどうすればよいですか?

  26. 26

    強く型付けされたリフレクションを使用して、ジェネリックパラメーターを持つメソッドを見つけることはできますか?

  27. 27

    ジェネリックメソッドの実装におけるさまざまな戻り値の型

  28. 28

    メソッドをインターフェースでジェネリックにするか、必要な数だけ持ってください

  29. 29

    メソッドにリンクされたジェネリック型のTRTTITypeを取得する方法

ホットタグ

アーカイブ