Как я могу проверить, является ли объект определенного типа во время выполнения в C #? - PullRequest
5 голосов
/ 04 августа 2010

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

Ответы [ 9 ]

6 голосов
/ 04 августа 2010

Вы можете использовать ключевое слово 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
4 голосов
/ 04 августа 2010
MyType myObjectType = argument as MyType;

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

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

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

2 голосов
/ 04 августа 2010

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

Метод Object.GetType ().

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

1 голос
/ 04 августа 2010

В зависимости от вашего варианта использования «is» не будет работать должным образом.Возьмите класс Foo, полученный из класса Bar.Создайте объектный объект типа 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 голос
/ 04 августа 2010

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

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

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

1 голос
/ 04 августа 2010

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

1 голос
/ 04 августа 2010
myobject.GetType()
0 голосов
/ 13 ноября 2017

Вы также можете использовать переключатель / кейс в c # 7 ( сопоставление с шаблоном ).

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();
}

enter image description here

0 голосов
/ 04 августа 2010

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

System.Type type = typeof(int);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...