Различают тип, используемый для ссылки на объект, и тип его резервного хранилища. - PullRequest
6 голосов
/ 23 июня 2010
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();
    }
}

Обновление: Спасибо Дэну Брайанту за напоминание.

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

Ответы [ 2 ]

1 голос
/ 28 июня 2010

Вы можете использовать вывод общего типа:

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);
    }
}
0 голосов
/ 24 июня 2010

Согласно предложению выше, я публикую это как ответ. См. Комментарии выше для дальнейшего контекста.


Вы указали, что все еще видите «хранилище резервных копий» с LocalVariableInfo. Для меня это говорит о том, что объявление находится исключительно в источнике и вообще не закодировано в методе. Тот факт, что вы выбрали использование интерфейса в качестве «объявленного» типа, не имеет значения, так как компилятор решил использовать более конкретный тип для слота локальной переменной. Попробуйте запустить ILdasm на выходе DLL, и вы увидите, правда ли это. Если это так, ваш единственный вариант - посмотреть исходный код, поскольку в скомпилированной версии информации буквально не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...