2009-04-16 5 views
13

Sto provando a scrivere una convalida per verificare che un'istanza Object possa essere trasmessa a una variabile Type. Ho un'istanza di tipo per il tipo di oggetto che devono fornire. Ma il tipo può variare. Questo è fondamentalmente ciò che voglio fare.Come sapere se un'istanza è di un certo tipo o di qualsiasi tipo derivato

 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 
     } 

Il tipo di oggetto si ha l'IsSubClassOf e metodi IsInstanceOfType. Ma quello che voglio veramente verificare è se obj è un'istanza di typ o qualsiasi classe derivata da typ.

Sembra una domanda semplice, ma non riesco a capirlo.

risposta

24

ne dite di questo:

 

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

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

 

Questo ti dice se questo oggetto può essere colato a quel certo tipo.

+1

Sì, l'ho trovato più tardi la scorsa notte. Grazie comunque. –

7

Penso che sia necessario riformulare le condizioni, perché se obj è un'istanza di Derived, sarà anche un'istanza di Base. E typ.IsIstanceOfType(obj) restituirà true.

class Base { } 
class Derived : Base { } 

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

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

Se si sta lavorando con le istanze, si dovrebbe andare per Type.IsInstanceOfType

(ritorni) TRUE se il tipo corrente è nella gerarchia di ereditarietà dell'oggetto rappresentata da o, o se il tipo corrente è un'interfaccia supportata da o . false se nessuna di queste condizioni è il caso, o se o è nullNothingnullptrriferimento null (Nothing in Visual Basic), o se il corrente tipo è un tipo aperto generica (vale a dire, ContainsGenericParameters restituisce vero). - 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 

Se si lavora con oggetti Type, allora si dovrebbe guardare Type.IsAssignableFrom

(ritorni) vero se c e il tipo di corrente rappresentano lo stesso tipo, o se il tipo corrente è nella gerarchia ereditarietà di c, o se il tipo corrente è un'interfaccia che c implementa, oppure se c è un parametro di tipo generico e il tipo corrente rappresenta uno di t he vincoli di c. false se nessuna delle è vera o se c è nullNothingnullptra riferimento null (Nothing in Visual Basic). - MSDN