2016-06-13 39 views
0

我在寫一種TLV反序列化類。檢查Attribut是否已經使用了相同的值

和protobuf-net一樣,我有一個合約屬性爲屬性的類和屬性attribut。成員屬性具有類似於protobuf中的標籤號。 現在我想檢查一下標籤號是否已經被使用,最好的解決方案是如果有這種編譯器錯誤。如果這有幫助,我也有postsharp。 類的結構是這樣的:

[TlvContract] 
public class Person{ 
    [TlvMember(1)] 
    public String Name{get; set;} 
    [TlvMember(2)] 
    public Int32 ID{get; set;} 
    // This should create a warning or compile error!!!! 
    [TlvMember(1)] 
    public String Town{get; set;} 
} 

回答

1
從羅斯林分析儀

除此之外,PostSharp是一個可能的路要走。

下面是一個基本實現這樣的檢查和錯誤輸出:

[MulticastAttributeUsage(PersistMetaData = true)] 
public class TlvContractAttribute : TypeLevelAspect 
{ 
    public override void CompileTimeInitialize(Type target, AspectInfo aspectInfo) 
    { 
     Dictionary<int, PropertyInfo> indexes = new Dictionary<int, PropertyInfo>(); 

     foreach (PropertyInfo propertyInfo in target.GetProperties()) 
     { 
      TlvMemberAttribute memberAttr = 
       propertyInfo.GetCustomAttributes() 
        .Where(x => x is TlvMemberAttribute) 
        .Cast<TlvMemberAttribute>() 
        .SingleOrDefault(); 

      if (memberAttr == null) 
      { 
       Message.Write(MessageLocation.Of(propertyInfo), SeverityType.Error, "USR001", 
        "Property {0} should be marked by TlvMemberAttribute.", propertyInfo); 

       continue; 
      } 

      if (indexes.ContainsKey(memberAttr.Index)) 
      { 
       Message.Write(MessageLocation.Of(propertyInfo), SeverityType.Error, "USR002", 
        "Property {0} marked by TlvMemberAttribute uses Index {1}, which is already used by property {2}.", 
        propertyInfo, memberAttr.Index, indexes[memberAttr.Index]); 

       continue; 
      } 

      indexes[memberAttr.Index] = propertyInfo; 
     } 
    } 
} 

它可以在你定義它的程序集。您只需確保PostSharp實際上在您希望檢查工作的所有程序集上運行。

如果您的屬性需要不同的基類,則還可以實現ITypeLevelAspectITypeLevelAspectBuildSemantics接口。

+0

很好的回答!謝謝!!! – Franki1986