Поддерживается ли GetFields в PCL?

Я пытаюсь реализовать класс перечисления, найденный в https://github.com/jbogard/presentations/blob/master/WickedDomainModels/After/Model/Enumeration.cs.

В следующем коде я получаю ошибку компиляции, которая не может быть разрешена GetFields.

 public static IEnumerable<T> GetAll<T>() where T : Enumeration
 {
       var type = typeof(T);
       var fields = type.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly);

       return fields.Select(info => info.GetValue(null)).OfType<T>();
 }

Согласно http://msdn.microsoft.com/en-us/library/ch9714z3(v=vs.110).aspx, этот метод поддерживается в портативных библиотеках классов.

Моя библиотека предназначена для .NET для приложений Windows Store,.NET Framework 4.5 и Windows Phone 8.

Любая идея о том, что здесь происходит?

Решение

public static IEnumerable<T> GetAll<T>() where T : Enumeration
{
    var type = typeof(T);
    var fields = type.GetRuntimeFields().Where(x => x.IsPublic || x.IsStatic);

    return fields.Select(info => info.GetValue(null)).OfType<T>();
}

public static IEnumerable GetAll(Type type)
{
    var fields = type.GetRuntimeFields().Where(x => x.IsPublic || x.IsStatic);

    return fields.Select(info => info.GetValue(null));
}     

Ответ 1

Чтобы добавить к Дамиену ответ в .Net для приложений Windows Store, вы можете использовать следующий метод расширения:

using System.Reflection;

var fields = type.GetRuntimeFields();

http://msdn.microsoft.com/en-us/library/system.reflection.runtimereflectionextensions.getruntimefields.aspx

Это похоже на метод GetFields для .NET Framework.

Этот метод возвращает все поля, определенные для указанного типа, включая унаследованные, непубличные, экземпляры и статические поля.

Ответ 2

Просто потому, что метод говорит, что он поддерживается в портативных библиотеках классов, не означает, что он поддерживается для всех возможных целей. Если вы посмотрите на help для Type class, в нем перечислены все элементы и отображаются значки для каждой поддерживаемой системы.

В этом случае вы заметите, что рядом с GetFields нет значка с зеленой сумкой для покупок - он не поддерживается в приложениях Windows Store и до тех пор, пока вы включаете Windows Store в свой набор поддерживаемых целей для PCL, он не будет доступен.

Другой способ выразить это - в блоке информации о версии для методов, если они поддерживаются для Windows Store, в нем будет определен специальный раздел, в котором говорится об этом. Сравните GetGenericTypeDefinition:

enter image description here

.NET Framework
   Поддерживается в версиях: 4.5, 4, 3.5, 3.0, 2.0
Профиль клиента .NET Framework
   Поддерживается в: 4, 3.5 SP1
    Портативная библиотека классов
   Поддерживается в: Портативная библиотека классов
   .NET для приложений Windows Store
   Поддерживается в: Windows 8

to GetFields

enter image description here

.NET Framework
   Поддерживается в версиях: 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0
    Профиль клиента .NET Framework
   Поддерживается в: 4, 3.5 SP1
    Портативная библиотека классов
   Поддерживается в: Портативная библиотека классов

Для приложений Windows Store для отражения вы должны переключиться на использование класса TypeInfo, но обратите внимание, что он все еще не, в частности, поддерживают метод GetFields.