1

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

有没有更好的办法?

4

1 回答 1

1

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

从 r581 开始,可以通过以下方式获得:

ValueMember[] fields = metaType.GetFields();
SubType[] subTypes = metaType.GetSubtypes();
于 2012-08-19T13:14:34.803 回答