bei typisierten Listen Basisklasse des Typs erstellen



  • David_pb schrieb:

    Dieses Stück Code ist total überflüssig!

    So ist es. Zumindest so lange man mit der abgeleiteten Klasse nichts spezifisches vor hat...



  • maro158 schrieb:

    David_pb schrieb:

    Dieses Stück Code ist total überflüssig!

    So ist es. Zumindest so lange man mit der abgeleiteten Klasse nichts spezifisches vor hat...

    Selbst in diesem Fall würde der else-Zweig nie erreicht werden. 🙂



  • David_pb schrieb:

    Selbst in diesem Fall würde der else-Zweig nie erreicht werden. 🙂

    Und schon wieder hast Du recht. Also, ich korrigiere:

    if (item is B)
                        Console.WriteLine((item as B).Age);
                    else if (item is A)
                        Console.WriteLine((item as A).Name);
    

    👍

    Nun, das meinte ich.



  • Anmerkung: Man kann übrigens auch auf einen konkreten Typen testen.

    if (item.GetType() == typeof( B ) )
       Console.WriteLine((item as B).Age);
    else if (item.GetType() == typeof( A ) )
       Console.WriteLine((item as A).Name);
    


  • bool b = item.GetType() == typeof( B );
    

    ist daselbe wie

    bool b = item is B;
    


  • simon.gysi schrieb:

    bool b = item.GetType() == typeof( B );
    

    ist daselbe wie

    bool b = item is B;
    

    Durchaus nicht:

    class A
      {
      }
    
      class B : A
      {
      }
    
      class C : B
      {
      }
    
      class Program
      {
        static void Main(string[] args)
        {
          A x = new C();
          Test1( x );
          Test2( x );
    
          Console.ReadKey();
        }
    
        static void Test1( object x )
        {
          if ( x is A )
            Console.WriteLine( "is A" );
    
          if ( x is B )
            Console.WriteLine( "is B" );
    
          if ( x is C )
            Console.WriteLine( "is C" );
        }
    
        static void Test2( object x )
        {
          if ( x.GetType() == typeof( A ) )
            Console.WriteLine( "_is_ A" );
    
          if ( x.GetType() == typeof( B ) )
            Console.WriteLine( "_is_ B" );
    
          if ( x.GetType() == typeof( C ) )
            Console.WriteLine( "_is_ C" );
        }
      }
    


  • 100% acknowledge.



  • David_pb schrieb:

    Durchaus nicht

    Ein Blick hinter die Kulissen:

    // if (item.GetType() == typeof(B))
        IL_0107:  ldloc.s    V_6
        IL_0109:  callvirt   instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
        IL_010e:  ldtoken    DerivedClassInGenericList.B
        IL_0113:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
        IL_0118:  ceq
    
    // if (item is B)
        IL_0107:  ldloc.s    V_6
        IL_0109:  [b]isinst[/b]     DerivedClassInGenericList.B
        IL_010e:  ldnull
        IL_010f:  cgt.un
    

    Wie man im letzten IL-Codeblock sieht, wird im Fall von if (item is 😎 einfach isinst aufgerufen. Isinst übeprüft ob die auf dem Stack abgelegte Referenz vom Typ DerivedClassInGenericList.B ODER ein von DerivedClassInGenericList.B abgeleiteter Typ ist.



  • Genau so ist das! 🙂



  • Ohje!

    Ich denke die generische Definition ist hier die beste Lösung für mich 🙂 Ich werd das mal probieren.

    Danke euch allen!


Anmelden zum Antworten