Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于检查对象是否为T的子类的扩展方法_C#_.net_.net 4.5 - Fatal编程技术网

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

C# 用于检查对象是否为T的子类的扩展方法,c#,.net,.net-4.5,C#,.net,.net 4.5,我试图编写一个扩展方法来检查对象是否是T的子类 以下是我所做的,但VisualStudio不接受 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.IsCh

我试图编写一个扩展方法来检查对象是否是T的子类

以下是我所做的,但VisualStudio不接受

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);
}
publicstaticboolischildof(此对象对象对象)
{
返回(类型为obj)。发布类别为(类型为T));
}
[测试()]
公共空间是Childoftest()
{
var dog=新的dog();
var isAnimal=dog.IsChildOf();
断言(isAnimal);
}
你知道我该怎么写吗?

当你有一个类型的实例时,使用而不是
typeof

public static bool IsChildOf<T>(this object obj)
{
    return (obj.GetType().IsSubclassOf(typeof(T)));
}
publicstaticboolischildof(此对象对象对象)
{
返回(obj.GetType().IsSubclassOf(typeof(T));
}
公共静态布尔值IsChildOf(此对象obj)
{
//不要忘记处理obj==null。
返回obj.GetType().IsSubclassOf(typeof(T));
}
公共静态bool IsChildOf(此对象对象对象)
{
返回obj!=null&(obj.GetType().IsSubclassOf(typeof(T)));
}

也可以使用
Assert.IsTrue
来代替
Assert.That
您可以只使用
is
但请注意,is与
IsSubclassOf
的作用并不完全相同。有关详细信息,请参见Jeppe的精彩评论,下面我也有一个例子

另一方面,出于某种原因,我认为Java不允许在这种通用情况下使用等价的
instanceof
,但在C#中也可以。即:

IsSubclassOf
之间的一个差异示例:

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

旁注:不鼓励使用“子类”和“父类”术语。你应该说“派生自”。汽车不是汽车的产物;汽车源于汽车。我会将你的方法命名为“DerivesFrom”,我同意。保留“has a”关系而不是“is a”关系的子/父术语。特别是在列表或递归关系(如树)中。注释:
typeof(X)
要求
X
是类型(如
T
),而不是值或表达式(如
obj
)。如果其中一个类型是接口或值类型,并且两个类相同,您是否知道
IsSubclassOf
为false?也许你想让
中识别?不过,使用C#关键字
is
可能更容易。见韦斯顿的答案。提到
的得票率是
。它并不完全等同于
类型.IsSubclassOf
。一些区别:如果
T
obj
的运行时类型是同一个类,
is
表示
true
IsSubclassOf
表示
false
。如果
T
是一个接口,
is
检查
obj
是否表示
interface
,而
issubclasssof
只是说
false
。如果
obj
的运行时类型是一个(装箱的)值类型,
is
按预期进行检查,而
IsSubclassOf
只是说不。
is
也考虑泛型中的协变和逆变,例如
IEnumerable
也是
IEnumerable
(请参见
IEnumerable
)Jeppe Stig Nielsen,这是一个很好的观点,它不是等价的。如果有误解,最好把这一点说清楚。事实上,尽管提议的名字是Childof,OP可能并不打算进行这些区分。@JeppeStigNielsen谢谢,这是我错过的很多重要信息!我想,
is
相当于
Type.IsAssignableFrom
我认为这是正确的,
IsAssignableFrom
。但是,如果使用
is
,如果真值明显,则可以得到一个很好的编译时警告。例如
void M(异常e){bool here=e是字符串;}
void M(int i){bool here=i是可格式化的;}
。如果
obj
null
(它的计算结果只是
false
),简单表达式
obj是T
不会爆炸。在我对韦斯顿答案的评论中,可以看到
is
的其他优点。
public static bool IsChildOf<T>(this object obj)
    {
        return obj != null && (obj.GetType().IsSubclassOf(typeof(T)));
    }
public static bool IsChildOf<T>(this object obj)
{
    return obj is T;
}
[Test()]
public void IsChildOfTest()
{
    var dog = new Dog();
    var isAnimal = dog is Animal;
    Assert.That(isAnimal);
}
[Test]
public void IsChildOfTest()
{
    var dog = new Dog();
    Assert.False(dog.GetType().IsSubclassOf(typeof(Dog)));
    Assert.True(dog is Dog);
}