2015-11-05 32 views
0

我想在運行時動態初始化RuntimeTypeModel。我正在使用下面的函數,它一直在工作,直到我添加了包含字段的部分。這個模型中的基本類型只使用ProtoMember屬性,沒有別的(從適當的bas類繼承的excpet)指定可以序列化的內容。這是錯誤的代碼。Protobuf網C#:添加字段到RuntimeTypeModel

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網軀幹和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() { } 

} 

回答

0

激活addField()返回父類型,而不是派生類型的元數據。