Typvergleich



  • Hallöle,

    da bin ich schon wieder.
    Diesmal mit einem fehlgeschlagenen Typenvergleich:

    Folgender Code in meiner DummyLibrary.dll:

    namespace W
    {
    	public class A
    	{
    	}
    
    	public class B: A
    	{
    	}
    
    	public class C: B
    	{
    	}
    
    	public class D
    	{
    	}
    }
    

    Und so sieht meine Konsolenanwendung aus:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Reflection;
    
    using W;
    
    namespace DummyConsole
    {
    
    	class Entry
    	{
    		static public bool IsMySubclassOf( Type derivedType, Type baseType )
    		{			
    			bool result = false;
    			Type testType = derivedType;
    
    			while( testType != null )
    			{
    				if( testType.GUID == baseType.GUID )
    				{
    					result = true;
    					break;
    				}
    
    				testType = testType.BaseType;
    			}
    
    			return ( result );
    		}
    
    		static void Main()
    		{	
                // Edit: Das hatte gefehlt!!!
                Console.WriteLine( new A().GetType().IsSubclassOf( typeof( A ) ) );		
                // Edit: Ende
    			Console.WriteLine( new B().GetType().IsSubclassOf( typeof( A ) ) );
    			Console.WriteLine( new C().GetType().IsSubclassOf( typeof( A ) ) );
    			Console.WriteLine( new D().GetType().IsSubclassOf( typeof( A ) ) );
    
    			Console.WriteLine( "---" );
    
    			Assembly asm = Assembly.ReflectionOnlyLoadFrom( "C:/src/DummyLibrary/bin/Debug/DummyLibrary.dll" );
    			Type[] types = asm.GetTypes();
    			foreach( Type item in types )
    			{
    				Console.WriteLine( "{0}/{1}", item.IsSubclassOf( typeof( A ) ), IsMySubclassOf( item, typeof( A ) ) );
    			}
    
    			Console.ReadLine();
    		}				
    	}
    }
    

    Die Aussgabe ist

    False
    True
    True
    False
    ---
    False/True
    False/True
    False/True
    False/False

    Der erste Abschnitt ist wie erwartet. Im 2. Abschnitt ist nur die rechte Seite wie erwartet.
    Kann mir einer erklären warum die Vergleiche im 2. Abschnitt mit IsSubClassOf() schiefgehen?



  • Anstatt new Class().GetType nimm typeof(Class) .

    Außerdem könntest du bitte den richigen Quelltext veröffendlichen? (Drei Console.WriteLine's ergeben keine 4 Einträge vor '---')

    Sonst kannst du auch Type.IsAssignableFrom versuchen.

    P.S.: Leicht Off-Topic: Schreibst du an einem Reflector?



  • Hallöle,

    Rhombicosidodecahedron schrieb:

    Anstatt new Class().GetType nimm typeof(Class) .

    Werde ich testen.

    Rhombicosidodecahedron schrieb:

    Außerdem könntest du bitte den richigen Quelltext veröffendlichen? (Drei Console.WriteLine's ergeben keine 4 Einträge vor '---')

    Sry, hatte während dem Posten noch ein

    Console.WriteLine( new A().GetType().IsSubclassOf( typeof( A ) ) );
    

    vor den anderen 3 eingefügt, damit es zur foreach()-Schleife paßt. 🙄

    Rhombicosidodecahedron schrieb:

    Sonst kannst du auch Type.IsAssignableFrom versuchen.

    Das habe ich schon probiert, das geht auch nicht.

    Rhombicosidodecahedron schrieb:

    P.S.: Leicht Off-Topic: Schreibst du an einem Reflector?

    Jein :D. Ich schreibe eine DataContract-Generator für WCF. Dazu extrahiere ich Infos aus dem Fachlayer per Reflection.


Anmelden zum Antworten