IsSubclassOf & IsAssignableFrom

2368 ワード

IsSubclassOf

  • クラス継承テスト
  • public class ClassA { }
    public class ClassB : ClassA { }
    public class ClassC : ClassB { }
    
    Console.WriteLine(typeof(ClassB).IsSubclassOf(typeof(ClassA))); // TRUE
    Console.WriteLine(typeof(ClassB).IsSubclassOf(typeof(ClassB))); // FALSE
    Console.WriteLine(typeof(ClassB).IsSubclassOf(typeof(ClassC))); // FALSE
    Console.WriteLine(typeof(ClassC).IsSubclassOf(typeof(ClassA))); // TRUE
    Console.WriteLine(typeof(ClassC).IsSubclassOf(typeof(ClassB))); // TRUE
    

    IsSubclassOfは、class間で継承されているかどうかを判断するために使用されます.インタフェース間の継承は判断できません.
  • インタフェース継承テスト
  • public interface ID { }
    public interface IE : ID { }
    public class ClassD : ID { }
    Console.WriteLine(typeof(ClassD).IsSubclassOf(typeof(ID))); // FALSE
    Console.WriteLine(typeof(IE).IsSubclassOf(typeof(ID));      // FALSE
    
  • 汎用クラステスト
  • public class ClassF { }
    public class ClassG : ClassF { }
    public class ClassH : ClassF { }
    // no type constraint, no good
    Console.WriteLine(typeof(ClassG<>).IsSubclassOf(typeof(ClassF<>))); //FALSE
    // no covariance support here
    Console.WriteLine(typeof(string).IsSubclassOf(typeof(object))); // TRUE
     Console.WriteLine(typeof(ClassG).IsSubclassOf(typeof(ClassF))); // FALSE
    // type constraint has to match
    Console.WriteLine(typeof(ClassG).IsSubclassOf(typeof(ClassF)));// TRUE
    Console.WriteLine(typeof(ClassH).IsSubclassOf(typeof(ClassF)));    // TRUE
    Console.WriteLine(typeof(ClassH).IsSubclassOf(typeof(ClassF)));   // FALSE
    

    特に汎用クラスの判断に注意

    IsAssignableFrom

    public interface IA { }
    public interface IB : IA { }
    public class ClassA : IA { }
    public class ClassB : ClassA { }
    Console.WriteLine(typeof(IA).IsAssignableFrom(typeof(IB)));            // TRUE
    Console.WriteLine(typeof(IA).IsAssignableFrom(typeof(IA)));            // TRUE
    Console.WriteLine(typeof(IB).IsAssignableFrom(typeof(IA)));            // FALSE
    Console.WriteLine(typeof(IA).IsAssignableFrom(typeof(ClassA)));        // TRUE
    Console.WriteLine(typeof(ClassA).IsAssignableFrom(typeof(ClassB)));    // TRUE
    

    指定したタイプのインスタンスから現在のタイプのインスタンスを割り当てることができるかどうかを決定するために使用します.すなわち,インタフェースクラスの継承と実装を判断するために用いられる.
    汎型テストは園友たちに自分でテストするように残した.