PCL是否支持GetFields?

mat*_*uma 9 c# portable-class-library .net-4.5

我正在尝试实现在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>();
 }
Run Code Online (Sandbox Code Playgroud)

根据http://msdn.microsoft.com/en-us/library/ch9714z3(v=vs.110).aspx,便携式类库支持此方法.

我的库的目标是.NET for 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));
}     
Run Code Online (Sandbox Code Playgroud)

dca*_*tro 11

要添加Damien的答案,在.Net for Windows Store Apps中,您可以使用以下扩展方法:

using System.Reflection;

var fields = type.GetRuntimeFields();
Run Code Online (Sandbox Code Playgroud)

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

这似乎相当于GetFields.Net Framework 的方法.

此方法返回在指定类型上定义的所有字段,包括继承,非公共,实例和静态字段.


Dam*_*ver 6

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

在这种情况下,你会发现,有没有环保购物袋旁边的图标GetFields-它不是在Windows应用商店中的应用程序的支持,所以只要你有Windows应用商店在您所设定的PCL支持的目标,也将无法使用.

另一种方法是 - 在方法的版本信息块中,如果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应用商店应用程序
受以下版本支持: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方法.