9

我正在尝试实现在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,可移植类库支持此方法。

我的库面向 Windows 应用商店应用程序、.NET Framework 4.5 和 Windows Phone 8 的 .NET。

知道这里发生了什么吗?

解决方案

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));
}     
4

2 回答 2

11

To add to Damien's answer, in .Net for Windows Store Apps, you can use the following extension method:

using System.Reflection;

var fields = type.GetRuntimeFields();

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

This seems to be the equivalent of the GetFields method for the .Net Framework.

This method returns all fields that are defined on the specified type, including inherited, non-public, instance, and static fields.

于 2013-10-22T08:23:01.967 回答
6

仅仅因为一个方法说它在可移植类库中受支持并不意味着它支持所有可能的目标。如果您查看Type该类的帮助,它会列出每个成员并显示每个受支持系统的图标。

在这种情况下,您会注意到旁边没有绿色购物袋图标GetFields- Windows 应用商店应用程序支持它,因此只要您在 PCL 支持的目标集中包含 Windows 应用商店,它就不会可用.

另一种说法是 - 在方法的版本信息块中,如果 Windows Store 支持它们,则会有一个特定的部分说明它。比较GetGenericTypeDefinition

在此处输入图像描述

.NET Framework
受支持:4.5、4、3.5、3.0、2.0
.NET Framework Client Profile
受支持:4、3.5 SP1
可移植类库
受支持:可移植类库
.NET for Windows Store 应用程序
受支持:Windows 8

GetFields

在此处输入图像描述

.NET Framework
受以下版本 支持:4.5、4、3.5、3.0、2.0、1.1、1.0
.NET Framework Client Profile
受以下版本支持:4、3.5 SP1
可移植类库
受以下版本 支持:可移植类库

对于 Windows 应用商店应用程序,对于反射,您应该切换到使用TypeInfo该类 - 但请注意,它仍然不特别支持该GetFields方法。

于 2013-10-22T08:09:04.683 回答