我正在尝试实现在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));
}
答案 0 :(得分:11)
要添加Damien的答案,在.Net for Windows Store Apps中,您可以使用以下扩展方法:
using System.Reflection;
var fields = type.GetRuntimeFields();
这似乎相当于.Net Framework的GetFields
方法。
此方法返回在指定类型上定义的所有字段, 包括继承,非公开,实例和静态字段。
答案 1 :(得分:6)
仅仅因为方法表明它在Portable Class Libraries中受支持并不意味着它支持所有可能的目标。如果您查看Type
class的帮助,它会列出每个成员并显示每个受支持系统的图标。
在这种情况下,您会注意到GetFields
旁边没有绿色购物袋图标 - 在Windows应用商店应用中支持 ,因此只要您包含Windows应用商店在您的PCL支持目标集中,它将无法使用。
另一种方法是 - 在方法的版本信息块中,如果Windows Store支持它们,则会有一个特定部分说明它。比较GetGenericTypeDefinition
:
.NET Framework
受以下支持:4.5,4,3.5,3.0,2.0
.NET Framework客户端配置文件
受以下支持:4,3.5 SP1
便携式班级图书馆
受以下版本支持:Portable Class Library
适用于Windows应用商店应用的.NET
受以下版本支持:Windows 8
.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
方法。