2010-06-23 12 views
6
using System; 

interface IAnimal 
{ 
} 

class Cat: IAnimal 
{ 
} 

class Program 
{ 
    public static void Main(string[] args) 
    { 
     IAnimal cat = new Cat(); 

     // Console.WriteLine(cat.GetType()); 
      // This would only give me the type of 
      // the backing store, i.e. Cat. Is there a 
      // way I can get to know that the identifier 
      // cat was declared as IAnimal? 

     Console.ReadKey(); 
    } 
} 

Aggiornamento: Grazie a Dan Bryant per il promemoria.differenziare la natura utilizzato per fare riferimento a un oggetto e il suo tipo di memoria di supporto

using System; 
using System.Reflection; 
using System.Collections.Generic; 
using System.Linq; 

namespace TypeInfo 
{ 
    class Program 
    { 
     public static void Main(string[] args) 
     { 
      IAnimal myCat = new Cat(); 
      ReflectOnType(); 
      Console.ReadKey(); 
     } 

     public static void ReflectOnType() 
     { 
      Assembly.GetExecutingAssembly(). 
       GetType("TypeInfo.Program"). 
       GetMethod("Main", 
       BindingFlags.Static| BindingFlags.Public). 
       GetMethodBody().LocalVariables. 
       ToList(). 
       ForEach(l => Console.WriteLine(l.LocalType)); 
     } 
    } 

    interface IAnimal { } 
    class Cat : IAnimal { } 
} 
+1

E 'possibile, ma è necessario riflettere sul metodo stesso; LocalVariableInfo ha un LocalType che puoi utilizzare. Vedi qui: http://stackoverflow.com/questions/2696691/can-i-get-the-method-local-variables-through-a-stack-trace-in-c –

+1

Perché dovresti farlo quando il il tipo è già disponibile staticamente? –

+0

@Dan Bryant: Accidenti! Dannazione! Dannazione! Io uso LocalVariableInfo e LocalType tutto il tempo. Cosa c'è di sbagliato in me? E l'ho usato in uno scenario simile prima. Dannazione! Perché ho fatto questa domanda? Grazie mille per il promemoria. –

risposta

0

Per suggerimenti sopra, sto postando questo come risposta. Vedi i commenti sopra per ulteriore contesto.


Hai indicato che stai ancora visualizzando il "backing store" con LocalVariableInfo. Ciò che questo mi suggerisce è che la dichiarazione è puramente nella fonte e non è effettivamente codificata nel metodo. Il fatto che tu abbia scelto di utilizzare un'interfaccia come tipo "dichiarato" è irrilevante, in quanto il compilatore ha scelto di utilizzare il tipo più specifico per lo slot della variabile locale. Prova a eseguire ILdasm sul tuo output DLL e puoi vedere se questo è vero. Se lo è, l'unica opzione è di guardare effettivamente il codice sorgente, poiché le informazioni letteralmente non esistono nella versione compilata.

+0

Sono stato corretto. Non ero. Mentre avevo scritto il codice per usare LocalVariableInfo.LocalType, ero, err, nemmeno a chiamare il codice. Il mio codice chiamante aveva ancora Console.WriteLine (obj.GetType()). –

1

È possibile utilizzare l'inferenza di tipo generico:

using System; 

internal interface IAnimal 
{ 
} 

internal class Cat : IAnimal 
{ 
} 

class Program 
{ 
    static void Main() 
    { 
     var cat = new Cat(); 
     Console.WriteLine(cat.GetType()); // Cat 
     Console.WriteLine(GetStaticType(cat)); // Cat 

     IAnimal animal = cat; 
     Console.WriteLine(GetStaticType(animal)); // IAnimal 
    } 

    static Type GetStaticType<T>(T _) 
    { 
     return typeof (T); 
    } 
} 
Problemi correlati