C#でジェネリック制約の有効な型オブジェクトを取得するにはどうすればよいですか?

レジスメイ

リフレクションを使用して、アセンブリで提供されたデータを解析しようとしています。私のシナリオでは、ジェネリックパラメーターにどのような制約があるのか​​を理解しようとしています。ここで、非常に奇妙な問題が発生します。一般的な制約は、機能不全のTypeオブジェクトを返します。

このコードをあなたと共有しましょう:

public class GenericTest
{

    public class MyGenericClass<T, U, V>
        where T : System.IO.StringReader
        where U : System.IO.StringWriter
        where V : SomeOtherClass<V>
    {
    }

    public class SomeOtherClass<X>
    {
    }

    public static void Test()
    {
        Assembly a = Assembly.GetAssembly(typeof(GenericTest));
        foreach (Type t in a.GetTypes()) {
            Console.Out.WriteLine(t.FullName);
            if (t.IsGenericType) {
                Console.Out.WriteLine("\tIsGeneric!");
                foreach (Type parm in t.GetGenericArguments()) {
                    Console.Out.WriteLine("\tGeneric parameter: " + parm.Name);
                    Type[] constraints = parm.GetGenericParameterConstraints();
                    for (int i = 0; i < constraints.Length; i++) {
                        Console.Out.WriteLine("\t\t constraint " + i + ": name = " + constraints[i].Name);
                        Console.Out.WriteLine("\t\t constraint " + i + ": fullname = " + constraints[i].FullName);
                    }
                }
            }
        }

    }

}

出力は次のとおりです。

ProcessCSharpAssemblies.Program
ProcessCSharpAssemblies.GenericTest
ProcessCSharpAssemblies.GenericTest+MyGenericClass`3
    IsGeneric!
    Generic parameter: T
        constraint 0: name = StringReader
        constraint 0: fullname = System.IO.StringReader
    Generic parameter: U
        constraint 0: name = StringWriter
        constraint 0: fullname = System.IO.StringWriter
    Generic parameter: V
        constraint 0: name = SomeOtherClass`1
        constraint 0: fullname =
ProcessCSharpAssemblies.GenericTest+SomeOtherClass`1
    IsGeneric!
    Generic parameter: X

しかし、それは私が期待することではありません。私は期待します:

ProcessCSharpAssemblies.Program
ProcessCSharpAssemblies.GenericTest
ProcessCSharpAssemblies.GenericTest+MyGenericClass`3
    IsGeneric!
    Generic parameter: T
        constraint 0: name = StringReader
        constraint 0: fullname = System.IO.StringReader
    Generic parameter: U
        constraint 0: name = StringWriter
        constraint 0: fullname = System.IO.StringWriter
    Generic parameter: V
        constraint 0: name = SomeOtherClass`1
        constraint 0: fullname = ProcessCSharpAssemblies.GenericTest+SomeOtherClass`1
ProcessCSharpAssemblies.GenericTest+SomeOtherClass`1
    IsGeneric!
    Generic parameter: X

重要なのは、同じアセンブリで定義されたジェネリッククラスを参照する制約FullName返さnullれるということです。これは非常に奇妙に思えます。なぜ有効なTypeオブジェクトを取得できないのですProcessCSharpAssemblies.GenericTest.SomeOtherClassか?このように、私はクラスSomeOtherClassどのようなものであるかを知る方法がありませんこの特定の例でconstraints[i].DeclaringTypeは、有効な型オブジェクトを返します。しかし、私はこれが当てはまらないさまざまな状況に遭遇しました。そのため、tpが妥当であると見なされない型オブジェクトを取得しているようです。

Q:なぜこれが当てはまるのか誰かが考えていますか?

Q:次のようなタイプのFQNを取得するにはどうすればよいSomeOtherClassですか?

Q:さまざまな理由で、最新バージョンの.Netを使用できません。誰かがこの問題が最新バージョンの.Netでまだ発生するかどうかを確認できますか?

Gergely Hamos

この動作は、すべての.netバージョンで同じです。

その理由は、「備考」セクション(https://msdn.microsoft.com/en-us/library/system.type.fullname(v=vs.110)のSystem.Type.FullNameプロパティ定義に記載されていると思います。 aspx):

「現在のTypeがジェネリック型の型パラメーター、または配列型、ポインター型、または型パラメーターに基づくbyref型を表す場合、このプロパティはnullを返します。」

また、そこにいくつかの説明を見つけることができます。

この特定の場合(FullNameがnullでconstraints [i] .IsGenericTypeDefinitionがtrueの場合)にFQNが必要な場合は、代わりにこの行を使用してください

constraints[i].GetGenericTypeDefinition().FullName

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

別のジェネリック基本クラスにC#ジェネリック型制約を追加するにはどうすればよいですか?

分類Dev

インターフェイスをC#ジェネリック型制約として使用するにはどうすればよいですか?

分類Dev

このシナリオでジェネリックスと型制約を正しく使用するにはどうすればよいですか?

分類Dev

C#ジェネリックスパラメーターとしてオブジェクト型を持たないジェネリックメソッドの引数として渡された型を取得するにはどうすればよいですか?

分類Dev

C#でオープンジェネリックの型パラメーターの数を取得するにはどうすればよいですか?

分類Dev

Scalaでジェネリック型のオブジェクト/シングルトンを作成するにはどうすればよいですか?

分類Dev

Javaでオブジェクトのジェネリック型を動的に変更するにはどうすればよいですか?

分類Dev

反復可能な型によって制約されるジェネリックメソッドを作成するにはどうすればよいですか?

分類Dev

C#でオブジェクトをnull許容ジェネリックに変換するにはどうすればよいですか?

分類Dev

C#のジェネリック関数で型を渡すにはどうすればよいですか?

分類Dev

ジェネリック型のクラスを取得するにはどうすればよいですか?

分類Dev

ジェネリック型の制約:このC#ドキュメントで説明されているクラスのインスタンスを作成するにはどうすればよいですか?

分類Dev

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

分類Dev

ジェネリック制約を追加するにはどうすればよいですか?

分類Dev

C#のジェネリッククラス内でジェネリッククラスのオブジェクトを使用するにはどうすればよいですか?

分類Dev

C# で、2 つの異なる型でジェネリックスを使用するにはどうすればよいですか?

分類Dev

C ++でオブジェクトの値型を変更するにはどうすればよいですか?

分類Dev

C#ジェネリックを使用してクラスのオブジェクトをタイプTのオブジェクトに変換するにはどうすればよいですか?

分類Dev

この例では、同じインターフェイスから継承するさまざまなオブジェクトをジェネリック型で1つの変数に格納するにはどうすればよいですか?

分類Dev

あるジェネリック型がRustで別のジェネリック型を実装するという制約を追加するにはどうすればよいですか?

分類Dev

C#でオブジェクトの型を明示的にチェックせずに、オブジェクトをその具象型に自動的にキャストするにはどうすればよいですか?

分類Dev

ジェネリックスを介してオブジェクトのマージを迅速に実現するにはどうすればよいですか?

分類Dev

Javaでジェネリック型に制約を設定するにはどうすればよいですか?

分類Dev

複合ジェネリック型から値を取得するにはどうすればよいですか?

分類Dev

実行時にジェネリック型を取得するにはどうすればよいですか?

分類Dev

リストにジェネリックオブジェクトのプロパティを設定するにはどうすればよいですか?

分類Dev

このJSONでC#オブジェクトを作成するにはどうすればよいですか

分類Dev

Mapオブジェクトを2つのジェネリックパラメーターで拡張するJAVAジェネリック型を定義するにはどうすればよいですか?

分類Dev

Objective-Cのジェネリック型を見つけるにはどうすればよいですか?

Related 関連記事

  1. 1

    別のジェネリック基本クラスにC#ジェネリック型制約を追加するにはどうすればよいですか?

  2. 2

    インターフェイスをC#ジェネリック型制約として使用するにはどうすればよいですか?

  3. 3

    このシナリオでジェネリックスと型制約を正しく使用するにはどうすればよいですか?

  4. 4

    C#ジェネリックスパラメーターとしてオブジェクト型を持たないジェネリックメソッドの引数として渡された型を取得するにはどうすればよいですか?

  5. 5

    C#でオープンジェネリックの型パラメーターの数を取得するにはどうすればよいですか?

  6. 6

    Scalaでジェネリック型のオブジェクト/シングルトンを作成するにはどうすればよいですか?

  7. 7

    Javaでオブジェクトのジェネリック型を動的に変更するにはどうすればよいですか?

  8. 8

    反復可能な型によって制約されるジェネリックメソッドを作成するにはどうすればよいですか?

  9. 9

    C#でオブジェクトをnull許容ジェネリックに変換するにはどうすればよいですか?

  10. 10

    C#のジェネリック関数で型を渡すにはどうすればよいですか?

  11. 11

    ジェネリック型のクラスを取得するにはどうすればよいですか?

  12. 12

    ジェネリック型の制約:このC#ドキュメントで説明されているクラスのインスタンスを作成するにはどうすればよいですか?

  13. 13

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

  14. 14

    ジェネリック制約を追加するにはどうすればよいですか?

  15. 15

    C#のジェネリッククラス内でジェネリッククラスのオブジェクトを使用するにはどうすればよいですか?

  16. 16

    C# で、2 つの異なる型でジェネリックスを使用するにはどうすればよいですか?

  17. 17

    C ++でオブジェクトの値型を変更するにはどうすればよいですか?

  18. 18

    C#ジェネリックを使用してクラスのオブジェクトをタイプTのオブジェクトに変換するにはどうすればよいですか?

  19. 19

    この例では、同じインターフェイスから継承するさまざまなオブジェクトをジェネリック型で1つの変数に格納するにはどうすればよいですか?

  20. 20

    あるジェネリック型がRustで別のジェネリック型を実装するという制約を追加するにはどうすればよいですか?

  21. 21

    C#でオブジェクトの型を明示的にチェックせずに、オブジェクトをその具象型に自動的にキャストするにはどうすればよいですか?

  22. 22

    ジェネリックスを介してオブジェクトのマージを迅速に実現するにはどうすればよいですか?

  23. 23

    Javaでジェネリック型に制約を設定するにはどうすればよいですか?

  24. 24

    複合ジェネリック型から値を取得するにはどうすればよいですか?

  25. 25

    実行時にジェネリック型を取得するにはどうすればよいですか?

  26. 26

    リストにジェネリックオブジェクトのプロパティを設定するにはどうすればよいですか?

  27. 27

    このJSONでC#オブジェクトを作成するにはどうすればよいですか

  28. 28

    Mapオブジェクトを2つのジェネリックパラメーターで拡張するJAVAジェネリック型を定義するにはどうすればよいですか?

  29. 29

    Objective-Cのジェネリック型を見つけるにはどうすればよいですか?

ホットタグ

アーカイブ