Reflextions: Generischer Typ Parameter herrausfinden



  • Hallo Leute,

    folgender Umstand:

    interface IFoo<T>
    {
    }
    
    class Bar : IFoo<int>
    {
    }
    

    Nun will ich über den Type von Bar herrausfinden welcher generische Type T Foo verwendet!

    Meine Lösung:

    Type t = typeof(Bar).GetInterface("IFoo´1").GetGenericArguments().First();
    

    Ist das die einzigse bzw. beste und schönste mögluchkeiute?? weil das "IFoo´1" Konvention etwas komisch ist find ich:)

    Grüß3


  • Administrator

    Alternative ohne String:

    var type = typeof(Bar)
      .GetInterfaces()
      .First(t => t.IsGenericType &&
                  t.GetGenericTypeDefinition() == typeof(IFoo<>))
      .GetGenericArguments()
      .First();
    

    Grüssli



  • Perfekt!! thx



  • Dravere schrieb:

    Alternative ohne String:

    var type = typeof(Bar)
      .GetInterfaces()
      .First(t => t.IsGenericType &&
                  t.GetGenericTypeDefinition() == typeof(IFoo<>))
      .GetGenericArguments()
      .First();
    

    Grüssli

    Die Loesung find ich gut, aber eine Anmerkung hab ich da.
    Ist es gewollt das du ne Exception bekommst wenn First nichts findet?
    Vielleicht FirstOrDefault an der Stelle verwenden?


  • Administrator

    Firefighter schrieb:

    Ist es gewollt das du ne Exception bekommst wenn First nichts findet?
    Vielleicht FirstOrDefault an der Stelle verwenden?

    Kommt ganz darauf an, was die Rahmenbedingungen sind. Vielleicht ist es per Logik gegeben, dass immer das Interface IFoo implementiert wird. Ich habe jetzt nicht speziell darauf geachtet, dass kann ja jeder so anpassen, wie ihm das gefällt. Man kann es auch ganz ohne Linq lösen 🙂

    Grüssli


Anmelden zum Antworten