C# 判断对象是否属于某个类

介绍

在 C# 中,判断一个对象是否属于某个类(或其派生类)可以通过以下几种方法实现,适用于不同场景:

1. 使用 is 关键字(推荐)

is 关键字 用于检查对象是否与指定类型兼容,返回 bool 值。
特点:

  • 若对象为 null,直接返回 false
  • 支持派生类(子类对象会被判定为与父类兼容)
// 定义示例类
public class Animal { }
public class Dog : Animal { }

// 判断示例
Animal animal = new Dog();
Dog dog = new Dog();
object obj = new Dog();
Animal nullAnimal = null;

// 检查对象是否为 Dog 类型
bool isDog1 = animal is Dog;   // true(Dog 是 Animal 的子类)
bool isDog2 = dog is Dog;     // true
bool isDog3 = obj is Dog;     // true
bool isDog4 = nullAnimal is Dog; // false(null 不会被判定为任何类型)

// 检查对象是否为 Animal 类型(包括子类)
bool isAnimal = dog is Animal; // true(Dog 继承自 Animal)

2. 使用 typeof + GetType() 比较(精确类型匹配)

obj.GetType() 获取对象的实际类型,typeof(Class) 获取指定类的类型,两者比较可实现精确匹配(不包含派生类)。
特点:

  • 必须精确匹配类型(子类对象不会被判定为父类类型)
  • 若对象为 null,调用 GetType() 会抛出 NullReferenceException,需先判空
Animal animal = new Dog();
Dog dog = new Dog();

// 精确判断类型(不包含继承关系)
bool isExactDog1 = animal.GetType() == typeof(Dog);  // true(animal 实际是 Dog 实例)
bool isExactDog2 = dog.GetType() == typeof(Dog);    // true
bool isExactAnimal = dog.GetType() == typeof(Animal); // false(Dog ≠ Animal)

// 安全写法(先判空)
if (animal != null && animal.GetType() == typeof(Dog))
{
    // 处理逻辑
}

3. 使用 as 关键字(转换 + 判断结合)

as 关键字尝试将对象转换为指定类型,转换失败返回 null。可同时实现“转换+判断”。
适用场景:需要在判断后使用该类型的对象。

object obj = new Dog();

// 尝试转换为 Dog 类型
Dog dog = obj as Dog;

// 若转换成功(不为 null),则 obj 是 Dog 类型
if (dog != null)
{
    Console.WriteLine("obj 是 Dog 类型");
    // 可直接使用 dog 变量
}

4. 使用 Type.IsInstanceOfType() 方法

Type 类的 IsInstanceOfType(object) 方法判断指定对象是否为该类型的实例(包括派生类)。
用法:typeof(目标类型).IsInstanceOfType(对象)

Animal animal = new Dog();
bool isDog = typeof(Dog).IsInstanceOfType(animal); // true
bool isAnimal = typeof(Animal).IsInstanceOfType(animal); // true

总结:场景选择

方法 特点 推荐场景
is 关键字 简洁,自动处理 null,包含派生类 仅需判断类型,不立即使用转换后对象
typeof + GetType() 精确匹配,不包含派生类,需手动判空 需要严格区分父类和子类的场景
as 关键字 兼顾判断和转换,转换失败返回 null 判断后需要使用该类型对象
IsInstanceOfType() 面向 Type 对象的判断,包含派生类 动态类型判断(如反射场景)

根据实际需求选择最合适的方法,通常 is 和 as 是最常用的方式。