I have some classes and interface:
interface IAnimal
{
}
class Cat : IAnimal, ILiveInZoo
{
}
interface ILiveInZoo
{
}
Also, I have some methods and generic methods:
class Context
{
public ILiveInZoo GetWhoLivesInZoo(string name)
{
if (name == "Cat")
return new Cat();
return null;
}
static CompositionContainer Container = null;
public void GiveFood<T>(T animal) where T : IAnimal
{
var methods = Container.GetExports<Action<T, EventArgs>, AttributeMetadata>();
//execute methods
}
}
And here is a use case:
Context context = new Context();
var cat = context.GetWhoLivesInZoo("Cat");
if (cat is IAnimal animal)
{
context.GiveFood(animal);
}
As you can see in GiveFood metod I'm using MEF. In use case when I cast cat to IAnimal, in GiveFood method typeof(T) will be IAnimal not Cat. First question is: Instance of cat variable is Cat class. Why when I cast it typeof(T) will be IAnimal. My problem is when I cast cat to IAnimal interface, in GiveFood method, GetExports method returns method related to IAnimal not to Cat class. I found solution to fix that issue, it is using reflection:
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 });
}
Now typeof(T) is Cat class and in GiveFood I can get methods related to Cat class. Is there another way (without using reflection) to solve this issue?
Aucun commentaire:
Enregistrer un commentaire