6 votes

Faire la distinction entre le type utilisé pour référencer un objet et le type de son backing store.

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

Mise à jour : Merci à Dan Bryant pour le rappel.

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 { }
}

1voto

desco Points 12018

Vous pouvez utiliser l'inférence de type générique :

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

0voto

Dan Bryant Points 19021

Conformément à la suggestion ci-dessus, je publie ceci comme une réponse. Voir les commentaires ci-dessus pour plus de contexte.


Vous avez indiqué que vous voyez toujours le "backing store" avec LocalVariableInfo. Ce que cela me suggère, c'est que la déclaration est purement dans la source et n'est pas du tout encodée dans la méthode. Le fait que vous ayez choisi d'utiliser une interface comme type "déclaré" n'est pas pertinent, puisque le compilateur a choisi d'utiliser le type plus spécifique pour le slot de la variable locale. Essayez d'exécuter ILdasm sur votre sortie DLL et vous pourrez voir si c'est vrai. Si c'est le cas, votre seule option est de regarder le code source, puisque l'information n'existe littéralement pas dans la version compilée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X