Answers:
这里的不同答案有两种不同的含义。
如果要检查实例的类型是否正确,则
if (c.GetType() == typeof(TForm))
是要走的路。
如果您想知道c
是的实例TForm
还是子类,请使用is
/ as
:
if (c is TForm)
要么
TForm form = c as TForm;
if (form != null)
关于您实际上想要这些行为中的哪一个,在您的脑海中值得弄清楚。
is
并as
与模式匹配:if (x is TForm tf) {…
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
}
是的,“ is”关键字:
if (c is TForm)
{
...
}
查看有关MSDN的详细信息:http : //msdn.microsoft.com/zh-cn/library/scekt9xw(VS.80).aspx
检查对象是否与给定类型兼容。例如,可以确定对象是否与以下字符串类型兼容:
而且,有点相同
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
运算符。
T1.IsAssignableFrom(T2)
回报true
在情况下的as
运营商返回一个非空值,因为这些类型的实例。
如果要使用c作为TForm,则比其他答案要紧凑一些:
if(c is TForm form){
form.DoStuff();
}
bool isValid = c.GetType() == typeof(TForm) ? true : false;
或更简单
bool isValid = c.GetType() == typeof(TForm);
==
。在支持继承的对象或面向对象的语言中,除非您知道特定的Type绝不会从sealed
Class中继承。另外:使用返回(静态/常量)布尔值的三元运算符使我感到困扰,如果这是一条switch
语句,我将不那么麻烦。
instanceof
和C#is
是更好的方法。