Поддерживается ли 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
.