私はいくつかのクラスとインターフェースを持っています:
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
metodで見ることができるように、私は使っていMEF
ます。にキャストcat
したユースケースではIAnimal
、inGiveFood
メソッド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
。この問題を解決する別の方法(リフレクションを使用しない)はありますか?
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加