PCL是否支持GetFields?

时间:2013-10-22 08:02:18

标签: c# .net-4.5 portable-class-library

我正在尝试实现在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。

知道这里发生了什么事吗?

解决方案

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

2 个答案:

答案 0 :(得分:11)

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

using System.Reflection;

var fields = type.GetRuntimeFields();

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

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

  

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

答案 1 :(得分:6)

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

在这种情况下,您会注意到GetFields旁边没有绿色购物袋图标 - 在Windows应用商店应用中支持 ,因此只要您包含Windows应用商店在您的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
     便携式班级图书馆
     受以下版本支持:Portable Class Library
     适用于Windows应用商店应用的.NET
     受以下版本支持:Windows 8

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
     便携式班级图书馆
     受以下版本支持:Portable Class Library

对于Windows应用商店应用,要进行反射,您应该切换到使用TypeInfo类 - 但请注意,它仍然没有,特别是支持GetFields方法。