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