你如何枚举MetaType的成员?

时间:2012-08-19 12:27:48

标签: c# .net protobuf-net

我正在使用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();

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

是的,它没有曝光。有一个内部.Fields属性,但值得添加一个功能请求,以便在公共API上公开它。

这可以从r581开始,通过:

ValueMember[] fields = metaType.GetFields();
SubType[] subTypes = metaType.GetSubtypes();