我正在使用 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();
有没有更好的办法?