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