typeof演算子による型の比較
typeof 演算子を使って、指定された型が完全に一致するかどうかを調べることができます。オブジェクト指向的な意味での型の比較は多くの場合 is 演算子を使用しますが、typeof 演算子では型の厳密な一致を調べます。型を調べるにはGetType()関数もありますが、GetType関数はインスタンス(オブジェクト)の型を調べるのに対して、typeof演算子はコンパイル時に型を評価します。
C#
using System;
public class Animal { }
public class Dog : Animal { }
Animal myDog = new Dog();
// オブジェクトの実際の型を取得し、特定の型と厳密に比較
if (myDog.GetType() == typeof(Dog))
{
Console.WriteLine("myDog は Dog型 のインスタンスです.");
}
if (myDog.GetType() != typeof(Animal))
{
Console.WriteLine("myDogの型 は Animalとは正確には一致しません.");
}
// 型比較には'is' 演算子をつかうことが多い
if (myDog is Animal)
{
Console.WriteLine("myDog is a Animal.");
}
# myDog is an instance of Dog.
# myDogの型 は Animalとは正確には一致しません.
# myDog is a Dog (using 'is' operator).
DogはAnimalを継承していますから、オブジェクト指向的にはmyDogはAnimalのインスタンスなのですが、typeof演算子による14行目の比較では、myDogとAnimalは型が(正確には)一致しないことになります。
しかし、20行目のようにmyDogはAnimalのインスタンスですから myDog is Animal は成り立ちます。
typeofによるリフレクション
typeof演算子は、型のSystem.Typeインスタンスを返します(=> 公式ドキュメント参照)。そこから型の持つ様々な情報を得ることができます。
C#
using System;
using System.Reflection;
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public void SayHello()
{
Console.WriteLine($"Hello, my name is {Name}.");
}
}
public class Program
{
public static void Main(string[] args)
{
Type personType = typeof(Person);
// 型の名前を取得
Console.WriteLine($"Type Name: {personType.Name}"); // Person
// プロパティ情報を取得
PropertyInfo nameProperty = personType.GetProperty("Name");
if (nameProperty != null)
{
Console.WriteLine($"Property: {nameProperty.Name}, Type: {nameProperty.PropertyType.Name}");
}
// メソッド情報を取得
MethodInfo sayHelloMethod = personType.GetMethod("SayHello");
if (sayHelloMethod != null)
{
Console.WriteLine($"Method: {sayHelloMethod.Name}");
}
// インスタンスの作成 (コンストラクターがある場合)
object instance = Activator.CreateInstance(personType);
if (instance is Person p)
{
p.Name = "Alice";
p.Age = 30;
p.SayHello();
}
}
}
コメント