Мое намерение состоит в том, чтобы иметь класс 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 содержит три статических объектов типа фруктов. При попытке получить список всех таких объектов используется общий метод.
Спасибо, это сработало. Я отредактировал код выше, чтобы продемонстрировать решение. Теперь я также должен посмотреть на ваш совет. –
@Eddie - используйте [GetFields (BindingFlags.Static | BindingFlags.Public)] (http://msdn.microsoft.com/en-us/library/6ztex2dc.aspx) вместо GetMembers(). –
Да, теперь я получил информацию о критических разделах. Мне это нужно только для случайных звонков, и кеширование именно то, чего я пытаюсь избежать. Нужно ли кэшировать, можно написать конкретный конструктор, который помещает новые объекты в держатель данных. –