1

私の意図は、独自のタイプの静的な読み取り専用インスタンスがいくつかあるクラスTを持つことです。私が今やろうとしているのは、それらすべてのインスタンスを認識してリストに追加するジェネリックメソッドを作成することです。これまでのところ、すべての要素を見つけることができ、FieldInfo.FieldHandle.Valueにはオブジェクトが含まれているようですが、それを取得するのはまだ熟練していません。たぶん、FieldInfoを使用するのは間違っています。誰か私に手を貸してもらえますか?

(ありがとう!)これがコード例です(ソリューションが適用されています):

using System;
using System.Collections.Generic;
using System.Reflection;

namespace PickStatic {
  class Fruit {
    public static readonly Fruit Orange = new Fruit("Orange");
    public static readonly Fruit Kiwi = new Fruit("Kiwi");
    public static readonly Fruit Pear = new Fruit("Pear");

    public string name { set; get; }

    public Fruit(string name) {
      this.name = name;
    }

    public static List<T> getAll<T>() where T : class {
      List<T> result = new List<T>();
      MemberInfo[] members = typeof(T).GetMembers();
      foreach(MemberInfo member in members) {
        if(member is FieldInfo) {
          FieldInfo field = (FieldInfo) member;
          if(field.FieldType == typeof(T)) {
            T t = (T) field.GetValue(null);
            result.Add(t);
          }
        }
      }
      return result;
    }

    public static void Main(string[] args) {
      List<Fruit> fruits = getAll<Fruit>();
      foreach(Fruit fruit in fruits) {
        Console.WriteLine("Loaded: {0}", fruit.name);
      }
      Console.ReadLine();
    }
  }
}

クラスFruitには、Fruitタイプの3つの静的オブジェクトが含まれています。ジェネリックメソッドを使用して、そのようなすべてのオブジェクトのリストを取得しようとしています。

4

1 に答える 1

0

FieldInfo.GetValueメソッドを使用する必要があります。

null(静的フィールドであるため)で呼び出します

編集:コードの「クリティカル」セクションでリフレクションを使用することはお勧めしません(パフォーマンスの観点から)。ディクショナリを使用して、GetAllメソッドから返された結果をキャッシュできます。

于 2013-01-19T07:12:39.340 に答える