c#反射:从类中检索静态对象

本文关键字:检索 静态 对象 反射 | 更新日期: 2023-09-27 17:54:36

我的意图是有一个类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类型的静态对象。正在尝试使用泛型方法获取所有此类对象的列表

c#反射:从类中检索静态对象

您需要使用FieldInfo。GetValue方法。

null调用它(因为它是一个静态字段)

Edit:不建议在代码的"关键"部分使用反射(考虑到性能),您可以使用Dictionary来缓存从GetAll方法返回的结果。