Как я могу проверить, имеет ли объект определенный тип во времени выполнения в C#?

Как я могу проверить, имеет ли объект определенный тип во времени выполнения в C#?

6
задан Ricardo Altamirano 15 August 2012 в 15:33
поделиться

8 ответов

Вы можете использовать ключевое слово 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
7
ответ дан 8 December 2019 в 14:39
поделиться
MyType myObjectType = argument as MyType;

if(myObjectType != null)
{
   // this is the type
}
else
{
   // nope
}

Включена проверка на нуль

Редактировать: исправление ошибки

4
ответ дан 8 December 2019 в 14:39
поделиться

Операторы информации о типе (as, is, typeof): http://msdn.microsoft.com/en-us/library/6a71f45d (VS.71) .aspx

Метод Object.GetType ().

Имейте в виду, что вам, возможно, придется иметь дело с иерархиями наследования. Если у вас есть проверка типа obj.GetType () == typeof (MyClass), это может не сработать, если obj является производным от MyClass.

2
ответ дан 8 December 2019 в 14:39
поделиться

Я не могу добавлять комментарии, поэтому мне придется добавить это в качестве ответа. Имейте в виду, что из документации (http://msdn.microsoft.com/en-us/library/scekt9xw%28VS.80%29.aspx):

Выражение is оценивается как true, если предоставленное выражение не является нулевым, и предоставленный объект может быть приведен к предоставленному типу, не вызывая исключения.

Это не то же самое, что проверка типа с помощью GetType.

1
ответ дан 8 December 2019 в 14:39
поделиться

obj.GetType () возвращает тип

1
ответ дан 8 December 2019 в 14:39
поделиться
myobject.GetType()
1
ответ дан 8 December 2019 в 14:39
поделиться

В зависимости от вашего варианта использования '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);
      }
   }
}
1
ответ дан 8 December 2019 в 14:39
поделиться

Используйте ключевое слово typeof:

System.Type type = typeof(int);
-1
ответ дан 8 December 2019 в 14:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: