2013-01-19 5 views
1

Мое намерение состоит в том, чтобы иметь класс T, который имеет несколько статических экземпляров readonly своего типа. Теперь я пытаюсь создать общий метод, который распознает все эти экземпляры и добавит их в список. До сих пор я мог найти все элементы, и FieldInfo.FieldHandle.Value, похоже, содержит объект, но я пока не разбираюсь в его получении. Возможно, неправильно использовать FieldInfo. Может ли кто-нибудь дать мне руку? (Спасибо!)C# Отражение: извлечение статических объектов из класса

Вот пример кода (с раствором прилагается):

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 содержит три статических объектов типа фруктов. При попытке получить список всех таких объектов используется общий метод.

ответ

1

Вам необходимо использовать FieldInfo.GetValue method.

Призовите его null (Так как это статическое поле)

Редактировать: Не рекомендуется использовать отражение в «критических» участков кода (с точки зрения производительности), вы можете использовать словарь для кэширования результатов, возвращаемых методом GetAll.

+0

Спасибо, это сработало. Я отредактировал код выше, чтобы продемонстрировать решение. Теперь я также должен посмотреть на ваш совет. –

+1

@Eddie - используйте [GetFields (BindingFlags.Static | BindingFlags.Public)] (http://msdn.microsoft.com/en-us/library/6ztex2dc.aspx) вместо GetMembers(). –

+0

Да, теперь я получил информацию о критических разделах. Мне это нужно только для случайных звонков, и кеширование именно то, чего я пытаюсь избежать. Нужно ли кэшировать, можно написать конкретный конструктор, который помещает новые объекты в держатель данных. –

Смежные вопросы