C# 判断对象是否属于某个类 作者:马育民 • 2025-09-11 22:49 • 阅读:10004 # 介绍 在 C# 中,判断一个对象是否属于某个类(或其派生类)可以通过以下几种方法实现,适用于不同场景: ### 1. 使用 `is` 关键字(推荐) `is` 关键字 用于检查对象是否与指定类型兼容,返回 `bool` 值。 **特点**: - 若对象为 `null`,直接返回 `false` - 支持派生类(子类对象会被判定为与父类兼容) ```csharp // 定义示例类 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`,需先判空 ```csharp 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`。可同时实现“转换+判断”。 **适用场景**:需要在判断后使用该类型的对象。 ```csharp 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(对象)` ```csharp 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` 是最常用的方式。 原文出处:http://www.malaoshi.top/show_1GW1qOLSRWAf.html