2013-03-05 41 views
0

我正在連接到一個可能在未來幾個月內被顯着修改的API,並且希望將相關API標記存儲在資源中,以確保在發生更改時可以輕鬆更新它們。我可以在C#中使用JsonProperty屬性中的資源字符串嗎?

當我嘗試但是在JsonProperty(通過Newtonsoft)屬性使用這些資源串,我遇到了以下錯誤:

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type 

我曾嘗試創建一個自定義屬性來解決這個問題,但JsonProperty本身是封閉的並且是不可繼承的。

有沒有合理的方法讓我接近這個?我只是想念一些東西?

回答

2

JsonPropertyAttribute控制您的類將如何序列化爲JSON並返回。如果您在資源文件中定義了實際的json屬性名稱,那麼您的類將被序列化的方式將隨着這些資源文件的更新而變化,或者即使您的應用程序只是切換到其他語言環境。這通常不是一個好主意。但是,如果你的程序變化頻繁以至於你想修改你的類的序列化而不重新編譯,或者如果你想有多種序列化你的類的方法,我相信你將不得不寫你自己的IContractResolver

下面是一個例子:

public class ResourceNameContractResolver : 
    CamelCasePropertyNamesContractResolver 
{ 
    protected override IList<JsonProperty> CreateProperties CreatePropertiesInternal(Type type, MemberSerialization memberSerialization) 
    { 
     var list = base.CreateProperties(type, memberSerialization) 
     foreach (JsonProperty p in list) 
     { 
      p.PropertyName = this.GetRealNameFromResourceFile(p.PropertyName); 
     } 

     return list; 
    } 

    private string GetRealNameFromResourceFile(string originalPropertyName) 
    { 
     // Look up name from resource file 
    } 
} 

,並使用這個類

var settings = new JsonSerializerSettings() 
{ 
    ContractResolver = new ResourceNameContractResolver() 
}; 
JsonTextWriter writer = new JsonTextWriter(...); 
JsonSerializer serializer = JsonSerializer.Create(settings); 
serializer.Serialize(writer, myData); 
+0

你知道,如果沒有爲合同解決辦法一個大的性能衝擊嗎? – Maixy 2013-03-05 23:43:04

+0

@Maixy我無法想象性能影響會非常大。最大的打擊來自每次查看res文件中的屬性名稱,儘管通過在第一次嘗試時將整個res文件讀入內存可以加快速度。 – 2013-03-05 23:47:19

+0

好吧,非常感謝您的意見和快速回復!對於這種情況來說,最好的辦法似乎是將硬編碼的字符串作爲類中的常量,並期望在每次API更改時更新/重新編譯它們。 – Maixy 2013-03-05 23:52:13

相關問題