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

时间:2014-04-25 22:34:56

标签: c# .net .net-4.5

我正在尝试编写一个扩展方法来检查对象是否是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);
}

我知道怎么写这个?

4 个答案:

答案 0 :(得分:6)

如果您拥有类型的实例,请使用GetType代替typeof

public static bool IsChildOf<T>(this object obj)
{
    return (obj.GetType().IsSubclassOf(typeof(T)));
}

答案 1 :(得分:6)

您可以使用is但请注意 isIsSubclassOf完全相同。有关详细信息,请参阅Jeppe的优秀评论,我也在下面举例说明。

另一方面,我不认为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);
}

答案 2 :(得分:5)

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

答案 3 :(得分:2)

public static bool IsChildOf<T>(this object obj)
    {
        return obj != null && (obj.GetType().IsSubclassOf(typeof(T)));
    }

也使用Assert.IsTrue代替Assert.That