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 { }
}
Согласно предложению выше, я отправляю это как ответ. См. Комментарии выше для получения дополнительной информации.
Вы указали, что все еще видите «резервное хранилище» с LocalVariableInfo. Это говорит мне о том, что объявление находится исключительно в источнике и на самом деле вообще не закодировано в методе. Тот факт, что вы выбрали использование интерфейса в качестве «объявленного» типа, не имеет значения, поскольку компилятор решил использовать более конкретный тип для слота локальной переменной. Попробуйте запустить ILdasm для вывода вашей DLL, и вы увидите, правда ли это. Если это так, ваш единственный вариант - посмотреть на исходный код, поскольку информация буквально не существует в скомпилированной версии.
Вы можете использовать общий вывод типов:
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);
}
}