Как определить, имеет ли экземпляр определенный тип или любые производные типы
Я пытаюсь написать проверку, чтобы проверить, может ли экземпляр объекта быть перенесен в переменную 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.
Похоже на простой вопрос, но я не могу понять это.
Ответы
Ответ 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