Как я могу проверить, имеет ли объект определенный тип во времени выполнения в 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 ().
Имейте в виду, что вам, возможно, придется иметь дело с иерархиями наследования. Если у вас есть проверка типа obj.GetType () == typeof (MyClass), это может не сработать, если obj является производным от MyClass.
Я не могу добавлять комментарии, поэтому мне придется добавить это в качестве ответа. Имейте в виду, что из документации (http://msdn.microsoft.com/en-us/library/scekt9xw%28VS.80%29.aspx):
Выражение is оценивается как true, если предоставленное выражение не является нулевым, и предоставленный объект может быть приведен к предоставленному типу, не вызывая исключения.
Это не то же самое, что проверка типа с помощью GetType.
В зависимости от вашего варианта использования 'is' не будет работать должным образом. Возьмите класс Foo, производный от класса Bar. Создайте объект obj типа Foo. Оба '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);
}
}
}
Используйте ключевое слово typeof:
System.Type type = typeof(int);