MEFのジェネリックメソッドでクラスをキャストする

DIlshod K

私はいくつかのクラスとインターフェースを持っています:

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

あなたがGiveFoodmetodで見ることができるように、私は使ってい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この問題を解決する別の方法(リフレクションを使用しない)はありますか?

Velocirobtor

シンプルで使いやすいソリューションは、動的に使用することです。

Context context = new Context();
var cat = context.GetWhoLivesInZoo("Cat");
if (cat is IAnimal animal)
{
    context.GiveFood((dynamic)animal);
}

ただし、dynamic内部でReflection使用していることに注意してください(キャッシュを使用してパフォーマンスを少し向上させます)。したがって、本当にリフレクションを避けたい場合は、他の回答で説明されているビジターパターンがおそらく道です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

オブジェクトをメソッドジェネリック型にキャストする

分類Dev

compareToメソッドをComparableを実装するジェネリッククラスにキャストするにはどうすればよいですか?

分類Dev

列挙型をリストにキャストするEnumsNETジェネリックメソッド

分類Dev

ジェネリックメソッドでリストをキャストするのに混乱はありますか?

分類Dev

typescriptでジェネリッククラスのプロトタイプにメソッドを追加する方法

分類Dev

ジェネリッククラスと非ジェネリッククラスへのメソッドのキャスト

分類Dev

ジェネリックメソッドはTをオブジェクト型にキャストします

分類Dev

ジェネリックメソッドでコンストラクターからのスローをキャッチできません

分類Dev

ジェネリッククラスでキャストを強制する

分類Dev

子クラスの非ジェネリックメソッドでジェネリックメソッドを「非表示」にする

分類Dev

ジェネリックメソッドの列挙値をintにキャストします

分類Dev

オブジェクトを特定のジェネリック型にキャストして、このオブジェクトをメソッドに渡す方法

分類Dev

Javaでジェネリックメソッドタイプ変数にキャストするときのコンパイラ警告

分類Dev

非ジェネリッククラスをジェネリック基本クラスにキャストする

分類Dev

C#メソッドでジェネリックリストを操作する

分類Dev

JAVAのジェネリッククラスでオーバーライドメソッドを使用する方法

分類Dev

ジェネリックリポジトリコンシューマクラスでジェネリックメソッドを作成する

分類Dev

ジェネリッククラスの非ジェネリックリストでC#メソッドを呼び出す

分類Dev

前後にキャストする必要があるジェネリックメソッドのデリゲートを作成する方法

分類Dev

異なるクラスオブジェクトを取得するジェネリックメソッド

分類Dev

Scalaジェネリック:クラスの型を使用するにはメソッドが必要です

分類Dev

ジェネリックメソッドでインスタンスのメソッドを使用する

分類Dev

同じオブジェクトを返すクラスのジェネリックメソッド

分類Dev

ジェネリックメソッドで `Enum`値を` int`にキャストできません

分類Dev

外部スレッドからラベルのテキストを変更するためのC#ジェネリックメソッド。

分類Dev

ジェネリッククラスでジェネリックメソッド名を作成しますか?

分類Dev

Javaでメソッドをオーバーライドし、オブジェクトを親クラスの動作にキャストする

分類Dev

ジェネリックメソッドを使用するためにクラスとコンストラクタジェネリックを構築する方法

分類Dev

ジェネリッククラスメソッドのメソッドアドレスを取得するにはどうすればよいですか?

Related 関連記事

  1. 1

    オブジェクトをメソッドジェネリック型にキャストする

  2. 2

    compareToメソッドをComparableを実装するジェネリッククラスにキャストするにはどうすればよいですか?

  3. 3

    列挙型をリストにキャストするEnumsNETジェネリックメソッド

  4. 4

    ジェネリックメソッドでリストをキャストするのに混乱はありますか?

  5. 5

    typescriptでジェネリッククラスのプロトタイプにメソッドを追加する方法

  6. 6

    ジェネリッククラスと非ジェネリッククラスへのメソッドのキャスト

  7. 7

    ジェネリックメソッドはTをオブジェクト型にキャストします

  8. 8

    ジェネリックメソッドでコンストラクターからのスローをキャッチできません

  9. 9

    ジェネリッククラスでキャストを強制する

  10. 10

    子クラスの非ジェネリックメソッドでジェネリックメソッドを「非表示」にする

  11. 11

    ジェネリックメソッドの列挙値をintにキャストします

  12. 12

    オブジェクトを特定のジェネリック型にキャストして、このオブジェクトをメソッドに渡す方法

  13. 13

    Javaでジェネリックメソッドタイプ変数にキャストするときのコンパイラ警告

  14. 14

    非ジェネリッククラスをジェネリック基本クラスにキャストする

  15. 15

    C#メソッドでジェネリックリストを操作する

  16. 16

    JAVAのジェネリッククラスでオーバーライドメソッドを使用する方法

  17. 17

    ジェネリックリポジトリコンシューマクラスでジェネリックメソッドを作成する

  18. 18

    ジェネリッククラスの非ジェネリックリストでC#メソッドを呼び出す

  19. 19

    前後にキャストする必要があるジェネリックメソッドのデリゲートを作成する方法

  20. 20

    異なるクラスオブジェクトを取得するジェネリックメソッド

  21. 21

    Scalaジェネリック:クラスの型を使用するにはメソッドが必要です

  22. 22

    ジェネリックメソッドでインスタンスのメソッドを使用する

  23. 23

    同じオブジェクトを返すクラスのジェネリックメソッド

  24. 24

    ジェネリックメソッドで `Enum`値を` int`にキャストできません

  25. 25

    外部スレッドからラベルのテキストを変更するためのC#ジェネリックメソッド。

  26. 26

    ジェネリッククラスでジェネリックメソッド名を作成しますか?

  27. 27

    Javaでメソッドをオーバーライドし、オブジェクトを親クラスの動作にキャストする

  28. 28

    ジェネリックメソッドを使用するためにクラスとコンストラクタジェネリックを構築する方法

  29. 29

    ジェネリッククラスメソッドのメソッドアドレスを取得するにはどうすればよいですか?

ホットタグ

アーカイブ