2012-08-31 26 views
1

最近我裏面類JSON對象名稱聲明面臨聲明一個變量連字符,並能與下面來解決這個問題:如何在它

[JsonProperty("flv-270p")] 
     public string flv270p { get; set; } 

所以如果我要聲明FLV-270P沒有JsonProperty,我該怎麼做?

喜歡:

public string flv270-p { get; set; } 
+2

你laready做的,什麼是真正的一個問題? – Tigran

+0

@Tigran - 連字符在成員名稱中不合法。 – Oded

+2

@Tigran:我認爲這個問題是你如何聲明*並讓它工作*。 – Chris

回答

5

簡短的回答:你不能。

.NET支持任意成員名稱,包括CIL語言中的非法成員名稱。但是,如果一種語言不支持它,那麼你不能使用它,這包括連字符和破折號。出於這個原因,C#中的自動屬性在其隱藏的後臺字段名稱中使用<>

C#也讓你前綴與@符號的關鍵字,讓您可以使用它作爲一個變量或成員的名稱(例如public int @classpublic void @struct(int @interface)但是這是對消費者的利益。

但是C#不會讓你每當你使用的名字連字符在任何情況下,因爲該字符用於目負和二元減法子操作。一個名字flv270-p被解釋爲「flv270p」。

1

flv-270p是不是在C#有效的變量名。在代碼中鍵入類似的內容,th Ë編譯器認爲你正在嘗試做「flv270減去P」 :)

6

您不能:

有效的名稱定義爲:

identifier: 
    available-identifier 
    @ identifier-or-keyword 
available-identifier: 
    An identifier-or-keyword that is not a keyword 
identifier-or-keyword: 
    identifier-start-character identifier-part-charactersopt 
identifier-start-character: 
    letter-character 
    _ (the underscore character U+005F) 
identifier-part-characters: 
    identifier-part-character 
    identifier-part-characters identifier-part-character 
identifier-part-character: 
    letter-character 
    decimal-digit-character 
    connecting-character 
    combining-character 
    formatting-character 
letter-character: 
    A Unicode character of classes Lu, Ll, Lt, Lm, Lo, or Nl 
    A unicode-escape-sequence representing a character of classes Lu, Ll, Lt, Lm, Lo, or Nl 
combining-character: 
    A Unicode character of classes Mn or Mc 
    A unicode-escape-sequence representing a character of classes Mn or Mc 
decimal-digit-character: 
    A Unicode character of the class Nd 
    A unicode-escape-sequence representing a character of the class Nd 
connecting-character: 
    A Unicode character of the class Pc 
    A unicode-escape-sequence representing a character of the class Pc 
formatting-character: 
    A Unicode character of the class Cf 
    A unicode-escape-sequence representing a character of the class Cf 

連字號 - 減號是一流的鈀等以上不允許。

這的確是爲什麼允許類鈀的東西的名稱將是一個壞主意的原因之一:

int x-y = 3; 
int x = 10; 
int y = 2; 
int z = x-y; //3 or 8? Impossible to tell if the first line were allowed. 
0

其他的答案給出了很好的解釋,爲什麼你不能做exacwhat你在問。話雖如此,我遇到了一些情況,我希望我的對象元數據具有連字符,用於制定針對SEO優化的描述性URL。您在問題中使用的屬性方法有效,但您也可以使用約定來指示這種沒有屬性的定製。一個建議是預處理成員名稱以使用PascalCase並在單詞之間插入連字符分隔符。這可能會導致過多的元數據更改。另一種選擇是使用下劃線'_',這是C#名稱中的合法字符,並且在預處理中使用連字符替換下劃線。你的問題並沒有充分說明你的用例是如何在你的元數據上下文中實現/注入的,但是當你設計你的api時希望這些想法很有幫助。

2

其實你可以使用這樣的代碼

public string flv270_p { get; set; } 

,並返回一個格式化類,替換爲「 - 」和「_」。

例如, 如果你有這個,

var jsonstring = ApiRequest.DoRequest(ApiRequest.GetBaseUriFor(typeof(SMS), "/sms/json"), new Dictionary<string, string>() 
     { 
      {"from", request.from}, 
      {"to", request.to}, 
      {"text", request.text} 
     }); 

     return JsonConvert.DeserializeObject<SMSResponse>(jsonstring); 

做到這一點,

var jsonstring = ApiRequest.DoRequest(ApiRequest.GetBaseUriFor(typeof(SMS), "/sms/json"), new Dictionary<string, string>() 
     { 
      {"from", request.from}, 
      {"to", request.to}, 
      {"text", request.text} 
     }).Replace("-","_"); 

     return JsonConvert.DeserializeObject<SMSResponse>(jsonstring);