У меня есть некоторые классы и интерфейс:
interface IAnimal { }
interface ILiveInZoo { }
class Cat : IAnimal, ILiveInZoo { }
Кроме того, у меня есть несколько методов и универсальных методов:
class Context
{
private static CompositionContainer Container = null;
public ILiveInZoo GetWhoLivesInZoo(string name)
{
if (name == "Cat")
return new Cat();
return null;
}
public void GiveFood<T>(T animal) where T : IAnimal
{
var methods = Container.GetExports<Action<T, EventArgs>, AttributeMetadata>();
//execute methods
}
}
А вот пример использования:
Context context = new Context();
var cat = context.GetWhoLivesInZoo("Cat");
if (cat is IAnimal animal)
{
context.GiveFood(animal);
}
Как вы можете видеть в GiveFood
методе, который я использую MEF
.В случае использования, когда я разыгрываю cat
на IAnimal
, в GiveFood
метод typeof(T)
будет IAnimal
, а не Cat
.Первый вопрос: экземпляр переменной cat
- это класс Cat
.Почему, когда я разыграю его, typeof(T)
будет IAnimal
?Моя проблема заключается в том, что при преобразовании интерфейса cat
в IAnimal
в методе GiveFood
метод GetExports
возвращает метод, относящийся к IAnimal
, а не к классу Cat
.Я нашел решение, чтобы решить эту проблему, оно использует отражение:
Context context = new Context();
var cat = context.GetWhoLivesInZoo("Cat");
if (cat is IAnimal animal)
{
MethodInfo method = typeof(Context).GetMethod(nameof(Context.GiveFood));
MethodInfo generic = method.MakeGenericMethod(animal.GetType());
generic.Invoke(context, new object[] { animal });
}
Теперь typeof(T)
- это Cat
класс, а в GiveFood
я могу получить методы, связанные с Cat
классом.Есть ли другой способ (без использования отражения) решить эту проблему?