如何在C#中检查运行时对象是否属于某种类型?

如何在C#中检查运行时对象是否属于某种类型?

您可以使用is关键字。 例如:

using System; class CApp { public static void Main() { string s = "fred"; long i = 10; Console.WriteLine( "{0} is {1}an integer", s, (IsInteger(s) ? "" : "not ") ); Console.WriteLine( "{0} is {1}an integer", i, (IsInteger(i) ? "" : "not ") ); } static bool IsInteger( object obj ) { if( obj is int || obj is long ) return true; else return false; } } 

产生输出:

 fred is not an integer 10 is an integer 
 MyType myObjectType = argument as MyType; if(myObjectType != null) { // this is the type } else { // nope } 

包括空检查

编辑:错误纠正

类型信息运算符(as,is,typeof): http : //msdn.microsoft.com/en-us/library/6a71f45d (VS.71) .aspx

Object.GetType()方法。

请记住,您可能必须处理inheritance层次结构。 如果你有像obj.GetType()== typeof(MyClass)这样的检查,如果obj是从MyClass派生的东西,这可能会失败。

 myobject.GetType() 

obj.GetType()返回类型

我无法添加评论,因此我必须将其添加为答案。 请记住,从文档( http://msdn.microsoft.com/en-us/library/scekt9xw%28VS.80%29.aspx ):

如果提供的表达式为非null,则is表达式求值为true,并且可以将提供的对象强制转换为提供的类型,而不会引发exception。

这与使用GetType检查类型不同。

根据您的使用情况,’is’将无法按预期工作。 从类Bar中获取一个Foo类。 创建一个类型为Foo的对象obj。 ‘obj is Foo’和’obj is Bar’都将返回true。 但是,如果使用GetType()并与typeof(Foo)和typeof(Bar)进行比较,结果将会有所不同。

这里有解释,这里是一段演示这种差异的源代码:

 using System; namespace ConsoleApp { public class Bar { } public class Foo : Bar { } class Program { static void Main(string[] args) { var obj = new Foo(); var isBoth = obj is Bar && obj is Foo; var isNotBoth = obj.GetType().Equals(typeof(Bar)) && obj.GetType().Equals(typeof(Foo)); Console.Out.WriteLine("Using 'is': " + isBoth); Console.Out.WriteLine("Using 'GetType()': " + isNotBoth); } } } 

你也可以在c#7中使用switch / case ( 模式匹配 )。

 string DoubleMe(Object o) { switch (o) { case String s: return s + s; case Int32 i: return (i + i).ToString(); default: return "type which cannot double."; } } void Main() { var s= "Abc"; var i= 123; var now = DateTime.Now; DoubleMe(s).Dump(); DoubleMe(i).Dump(); DoubleMe(now).Dump(); } 

在此处输入图像描述

使用typeof关键字:

 System.Type type = typeof(int);