C# typeof演算子

C#

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();
        }
    }
}

コメント

タイトルとURLをコピーしました