用于检查对象是否是T的子类的扩展方法

本文关键字:子类 方法 扩展 检查 对象 是否是 用于 | 更新日期: 2023-09-27 18:00:08

我正在尝试编写一个扩展方法,检查对象是否是T.的子类

以下是我所做的,但没有被视觉工作室接受。

public static bool IsChildOf<T>(this object obj)
{
    return (typeof(obj).IsSubclassOf(typeof(T)));
}
[Test()]
public void IsChildOfTest()
{
    var dog = new Dog();
    var isAnimal = dog.IsChildOf<Animal>();
    Assert.That(isAnimal);
}

知道我该怎么写吗?

用于检查对象是否是T的子类的扩展方法

您只需使用is即可但请注意isIsSubclassOf的作用并不完全相同。有关详细信息,请参阅杰佩的精彩评论,我也在下面举了一个例子。

顺便说一句,出于某种原因,我认为Java不允许在这种通用情况下使用等效的instanceof,但在C#中是可以的。即:

public static bool IsChildOf<T>(this object obj)
{
    return obj is T;
}

这使得它变得如此琐碎,以至于读者更容易混淆使用扩展方法而不是直接使用is。如果你直接使用它,你的测试会看起来像:

[Test()]
public void IsChildOfTest()
{
    var dog = new Dog();
    var isAnimal = dog is Animal;
    Assert.That(isAnimal);
}

isIsSubclassOf之间差异之一的示例:

[Test]
public void IsChildOfTest()
{
    var dog = new Dog();
    Assert.False(dog.GetType().IsSubclassOf(typeof(Dog)));
    Assert.True(dog is Dog);
}

当您有类型为的实例时,请使用GetType而不是typeof

public static bool IsChildOf<T>(this object obj)
{
    return (obj.GetType().IsSubclassOf(typeof(T)));
}
public static Boolean IsChildOf<T>(this Object obj)
{
   // Don't forget to handle obj == null.
   return obj.GetType().IsSubclassOf(typeof(T));
}
public static bool IsChildOf<T>(this object obj)
    {
        return obj != null && (obj.GetType().IsSubclassOf(typeof(T)));
    }

也使用Assert.IsTrue代替Assert.That