Различайте тип, используемый для ссылки на объект и тип его запоминающего устройства

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

Обновление: Благодаря Dan Bryant для напоминания.

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 { }
}
6
задан Water Cooler v2 23 June 2010 в 20:25
поделиться

2 ответа

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


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

0
ответ дан 17 December 2019 в 22:10
поделиться

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

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);
    }
}
1
ответ дан 17 December 2019 в 22:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: