检查实例是否属于某种类型

Len*_*nie 165 .net c#

用它来检查是否c是实例TForm.

c.GetType().Name.CompareTo("TForm") == 0
Run Code Online (Sandbox Code Playgroud)

除了使用stringas作为参数之外,还有更安全的类型CompareTo()吗?

Jon*_*eet 385

这里的不同答案有两个不同的含义.

如果要检查实例是否是精确类型,那么

if (c.GetType() == typeof(TForm))
Run Code Online (Sandbox Code Playgroud)

是要走的路.

如果你想知道c是实例TForm 还是子类,那么使用is/ as:

if (c is TForm)
Run Code Online (Sandbox Code Playgroud)

要么

TForm form = c as TForm;
if (form != null)
Run Code Online (Sandbox Code Playgroud)

值得在脑海中清楚地了解您真正想要的这些行为.

  • 使用C#7,您可以将`is`和`as`与模式匹配结合起来:`if(x是TForm tf){...` (11认同)
  • 小注意事项:如果您不想使用演员表的结果,请使用"is",如果您这样做,请使用"as". (6认同)

Pos*_*Man 38

if(c is TFrom)
{
   // Do Stuff
}
Run Code Online (Sandbox Code Playgroud)

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

var tForm = c as TForm;
if(tForm != null)
{
   // c is of type TForm
}
Run Code Online (Sandbox Code Playgroud)

第二个示例只需要检查是否c属于类型TForm一次.如果您检查是否c有类型TForm然后投射它,那么CLR会经过额外的检查.这是一个参考.

编辑:Jon Skeet被盗

如果你想确定c是否有TForm继承的类TForm,那么使用

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


boj*_*boj 14

是的,"是"关键字:

if (c is TForm)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

有关MSDN的详细信息,请访问:http://msdn.microsoft.com/en-us/library/scekt9xw(VS.80).aspx

检查对象是否与给定类型兼容.例如,可以确定对象是否与字符串类型兼容,如下所示:


Bra*_*ham 10

而且,有点相同

Type.IsAssignableFrom(Type c)
Run Code Online (Sandbox Code Playgroud)

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

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


小智 9

如果你想使用c作为TForm,比其他答案更紧凑:

if(c is TForm form){
    form.DoStuff();
}
Run Code Online (Sandbox Code Playgroud)