【问题标题】:How do you enumerate MetaType's members?你如何枚举 MetaType 的成员?
【发布时间】:2012-08-19 12:27:47
【问题描述】:

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

有没有更好的办法?

【问题讨论】:

    标签: c# .net protobuf-net


    【解决方案1】:

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

    从 r581 开始提供,通过:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    相关资源
    最近更新 更多