我正在使用protobuf-net v2(r480),我有一个MetaType
类,其中一些成员已通过Add()
方法添加。我想枚举它们(获取ValueMember
个对象的集合),但似乎尽管有一个索引索引器,MetaType
不是IEnumerable
。
我发现了两种不理想的枚举成员的方式:MetaType
私有字段的反映,当内部实现发生变化时会破坏,而暴力攻击则是缓慢,浪费和愚蠢。
反射:
ValueMember[] fields = ((IEnumerable)typeof(MetaType)
.GetField("fields", BindingFlags.Instance | BindingFlags.NonPublic)
.GetValue(metaType)).OfType<ValueMember>().ToArray();
暴力(LINQ用于简洁,for
循环可能会更快):
ValueMember[] fields = Enumerable.Range(0, int.MaxValue).Select(i => metaType[i])
.Where(m => m != null).ToArray();
有更好的方法吗?
答案 0 :(得分:1)
是的,它没有曝光。有一个内部 .Fields
属性,但值得添加一个功能请求,以便在公共API上公开它。
这可以从r581开始,通过:
ValueMember[] fields = metaType.GetFields();
SubType[] subTypes = metaType.GetSubtypes();