Подтвердить что ты не робот

Как определить, имеет ли экземпляр определенный тип или любые производные типы

Я пытаюсь написать проверку, чтобы проверить, может ли экземпляр объекта быть перенесен в переменную Type. У меня есть экземпляр типа для типа объекта, который им необходимо предоставить. Но Тип может варьироваться. Это в основном то, что я хочу сделать.

        Object obj = new object();
        Type typ = typeof(string); //just a sample, really typ is a variable

        if(obj is typ) //this is wrong "is" does not work like this
        {
            //do something
        }

Сам объект типа имеет методы IsSubClassOf и IsInstanceOfType. Но я действительно хочу проверить, является ли obj либо экземпляр typ, либо любой класс, полученный из typ.

Похоже на простой вопрос, но я не могу понять это.

4b9b3361

Ответ 1

Как насчет этого:


    MyObject myObject = new MyObject();
    Type type = myObject.GetType();

    if(typeof(YourBaseObject).IsAssignableFrom(type))
    {  
       //Do your casting.
       YourBaseObject baseobject = (YourBaseObject)myObject;
    }  


Это говорит вам, может ли этот объект быть отнесен к определенному типу.

Ответ 2

Я думаю, вам нужно переформулировать свои условия, потому что если obj является экземпляром Derived, он также будет экземпляром Base. И typ.IsIstanceOfType(obj) вернет true.

class Base { }
class Derived : Base { }

object obj = new Derived();
Type typ = typeof(Base);

type.IsInstanceOfType(obj); // = true
type.IsAssignableFrom(obj.GetType()); // = true

Ответ 3

Если вы работаете с экземплярами, вы должны пойти Type.IsInstanceOfType

(Возвращает) true, если текущий тип в иерархии наследования объект, представленный o, или если current Type - это интерфейс, который o поддерживает. false, если ни один из этих условий, или если o nullNothingnullptra null ссылка (Ничего в Visual Basic), или если текущий тип - открытый общий тип (то есть ContainsGenericParameters возвращает true). - MSDN

        Base b = new Base();
        Derived d = new Derived();
        if (typeof(Base).IsInstanceOfType(b)) 
            Console.WriteLine("b can come in.");    // will be printed
        if (typeof(Base).IsInstanceOfType(d)) 
            Console.WriteLine("d can come in.");    // will be printed

Если вы работаете с объектами типа, вы должны посмотреть Type.IsAssignableFrom

(Возвращает) true, если c и текущий тип представляют один и тот же тип, или если текущий тип находится в наследовании иерархии c, или если текущий тип является интерфейсом, который c реализует, или если c - общий параметр типа и текущий тип представляет собой один из ограничения c. false, если ни один из эти условия верны, или если с nullNothingnullptra null ссылка (Ничего в Visual Basic). - MSDN