如何列出所有类成员(包括继承)tha都标有protobuf .net ProtoMember属性?

时间:2012-12-10 09:46:31

标签: c# .net inheritance reflection protobuf-net

具有类类型(例如,从C继承的D,从B继承)如何列出从顶级父级到底层级别按顺序标记有protobuf .net ProtoMember属性的所有类成员(包括继承的) (B成员,C成员,D成员)?

1 个答案:

答案 0 :(得分:1)

通常答案只是使用GetFields()GetProperties()Attribute.IsDefined进行反思。但是,在这种情况下,最好向protobuf-net模型询问认为存在的内容:

using ProtoBuf;
using ProtoBuf.Meta;
using System;
[ProtoContract, ProtoInclude(5, typeof(Bar))]
public class Foo
{
    [ProtoMember(1)]
    public int X { get; set; }
}
[ProtoContract]
public class Bar : Foo
{
    [ProtoMember(1)]
    public string Y { get; set; }
}
static class Program {
    static void Main() {
        var metaType = RuntimeTypeModel.Default[typeof(Bar)];
        do {
            Console.WriteLine(metaType.Type.FullName);
            foreach(var member in metaType.GetFields())
            {
                Console.WriteLine("> {0}, {1}, field {2}",
                    member.Member.Name, member.MemberType.Name,
                    member.FieldNumber);
            }
        } while ((metaType = metaType.BaseType) != null);
    }
}

这样做的好处是它甚至可以用于自定义配置(属性不是配置protobuf-net的唯一机制)