【发布时间】:2015-11-05 19:55:52
【问题描述】:
我正在尝试在运行时动态初始化 RuntimeTypeModel。我正在使用以下功能,该功能一直有效,直到我添加了包含字段的部分。此模型中的基本类型将仅使用 ProtoMember 属性,而没有其他任何东西(从适当的 bas 类继承的除外)来指定可以序列化的内容。这是错误的代码。
MetaType childMetaData = model[parentType].AddSubType(includeTagNumber++, child);
foreach (MemberInfo fi in child.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).OrderBy(x => x.Name).Reverse())
{
if (fi.MemberType == MemberTypes.Field || fi.MemberType == MemberTypes.Property)
{
if (fi.DeclaringType.Equals(child))
{
ProtoMemberAttribute attr = fi.GetCustomAttribute<ProtoMemberAttribute>();
if (attr.IsNotNull())
{
childMetaData.Add(attr.Tag, fi.Name); //Error here...
}
}
}
}
我收到一个 ArgumentException,它说它无法确定我的任何字段的 memberName 参数。
编辑: 我查看了 protobuf-net 的主干和 v1 代码,并运行了以下几行:
MemberInfo[] members = type.GetMember(memberName, Helpers.IsEnum(type) ? BindingFlags.Static | BindingFlags.Public : BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if(members != null && members.Length == 1) mi = members[0];
if (mi == null) throw new ArgumentException("Unable to determine member: " + memberName, "memberName");
当我在调用之前的行上运行相同的行时,它们会按预期出现,并返回 MemberInfo[1]... 那为什么呢?有什么帮助吗?
示例类:
class SerializedButton : VProtoCapable
{
[ProtoMember(1, IsRequired=true)]
private int someData
public int SomeData
{
get { return someData; }
set { someData = value; }
}
public SerializedButton() { }
}
【问题讨论】:
标签: c# runtime protocol-buffers protobuf-net custom-attributes