检查实例是否为类型


181

使用它检查是否c是的实例TForm

c.GetType().Name.CompareTo("TForm") == 0

除了使用a string作为参数之外,还有其他更安全的方法CompareTo()吗?


20
我当然希望您也不要在Java中那样做。Java instanceof和C#is是更好的方法。
Powerlord

Answers:


410

这里的不同答案有两种不同的含义。

如果要检查实例的类型是否正确,

if (c.GetType() == typeof(TForm))

是要走的路。

如果您想知道c是的实例TForm 还是子类,请使用is/ as

if (c is TForm)

要么

TForm form = c as TForm;
if (form != null)

关于您实际上想要这些行为中的哪一个,在您的脑海中值得弄清楚。


7
一个小注意事项:如果不想使用转换结果,请使用“ is”,如果要使用,请使用“ as”。
Aviram Fireberger,2015年

14
用C#7,你可以结合isas与模式匹配:if (x is TForm tf) {…
理查德

39
if(c is TFrom)
{
   // Do Stuff
}

或者如果您打算c用作TForm,请使用以下示例:

var tForm = c as TForm;
if(tForm != null)
{
   // c is of type TForm
}

第二个示例只需检查一次是否c为类型TForm。如果您检查如果查看是否c为类型,TForm然后进行强制转换,则在哪里,CLR将接受额外检查。这是参考

编辑:从乔恩·斯基特偷

如果要确定c是的,TForm而不要继承任何类TForm,请使用

if(c.GetType() == typeof(TForm))
{
   // Do stuff cause c is of type TForm and nothing else
}


10

而且,有点相同

Type.IsAssignableFrom(Type c)

“如果c和当前Type表示相同类型,或者当前Type在c的继承层次结构中,或者如果当前Type是c实现的接口,或者如果c是泛型类型参数并且当前Type,则为真代表c的约束之一。”

从这里:http : //msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx


这也是我个人的最爱。 typeof(Class).IsAssignableFrom(object.getType())类似于Java instanceof运算符。
SkidRunner's

如果它们不在继承层次结构的同一个分支中,但是存在转换运算符,是否给出false?
保罗Stelian

好问题@PaulStelian。我不确定自己的想法,但我猜想在那种情况下它将返回错误。那至少是我的预期行为。可能的话,如果存在隐式转换,则它可能返回true,但这将是奇怪的。
布拉德·坎宁安

有安装Visual Studio的人可以尝试吗?
Paul Stelian

1
@PaulStelian-返回false。通过点击doc链接可以看到这一点,并且观察到没有提及转换。想想它的另一种方式是T1.IsAssignableFrom(T2)回报true在情况下的as运营商返回一个非空值,因为这些类型的实例。
制造商



2

正如其他人提到的,“ is”关键字。但是,如果以后要将其转换为该类型,例如。

TForm t = (TForm)c;

然后,您应该使用“ as”关键字。

例如 TForm t = c as TForm.

那你可以检查

if(t != null)
{
 // put TForm specific stuff here
}

请不要按原样合并,因为这是重复检查。



-1
bool isValid = c.GetType() == typeof(TForm) ? true : false;

或更简单

bool isValid = c.GetType() == typeof(TForm);

恕我直言:我会避免直接的同情心==。在支持继承的对象或面向对象的语言中,除非您知道特定的Type绝不会从sealedClass中继承。另外:使用返回(静态/常量)布尔值的三元运算符使我感到困扰,如果这是一条switch语句,我将不那么麻烦。
SkidRunner
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.