1

次のシナリオがあります。

class Cow : Animal
{
   public int animalID;
   private static Cow instance;
   public static Cow Instance
   {
      get 
      {  
          if (instance == null) instance = new Cow();
          return instance;     
      }
    }
   private Cow() { }
}

Cowから継承する通常のシングルトンですAnimal。必要なもの: Dictionary<int, Animal>type から継承するすべてのシングルトンでAnimal、a) リストは最初にすべての既存のシングルトンで埋められます [既にインスタンス化されています]、および b) まだインスタンス化されていない辞書項目に追加するメソッド。

実装されたクラスのCow、Goat、およびZebraの場合、その動作が必要です:

public class Cow : Animal { ... }
public class Goat : Animal { ... }
public class Zebra : Animal { ... }

public static class AnimalManagement
{
   static Dictionary<int, Animal> zoo = new Dictionary<int, Animal>();
   static void FillDictionary();
   static Animal GetAnimalID(int animalID);    
}

public Main()
{
   var a1 = Cow.Instance;
   var a2 = Goat.Instance;

   AnimalManagement.FillDictionary();
   // Now, zoo.Count() == 2

   // Suppose I seeking for Zebra, with animalID  == 5:
   Animal zebra = AnimalManagement.GetAnimalID(5);
   // Thus, zoo.Count() == 3 and zeebra singleton was 
   // instantiated and added to internal dic of AnimalManagement.
}

そのため、リフレクションによって実行時に辞書を埋めたいと思います。私の友達は可能ですか?

前もって感謝します!

4

2 に答える 2

3

基本的に:

var types = myAssembly.GetTypes(t => typeof(Animal).IsAssignableFrom(t) && !t.IsAbstract);
var instances = types.Select(t => t.GetProperty("Instance", B.Static).GetValue(null, null));
于 2012-07-17T16:26:13.103 に答える
1

可能ですが、リフレクションは通常遅く、アセンブリ検索を行っている場合はさらに遅くなります。メタデータ (XML などの DSL) を使用して、探しているこの構成を実現できますか?

それでもリフレクションが必要な場合は、次の手順に要約されます (疑似コード):

  • 実行中のアセンブリを取得する
  • アセンブリからモジュールを取得します
  • type.BaseType == typeof(Animal) のモジュールから型を取得します
  • これらのタイプを取得したら、それらを作成する必要があります。Instanceタイプでメソッドを呼び出すことができます。または、シングルトン部分を削除する場合は、アクティベーター (アクティベーター API ) を使用してタイプを作成できます。いずれにせよ、あなたはあなたのAnimal.
于 2012-07-17T16:27:17.317 に答える