2014-01-27 40 views
2

我有一個簡單的類,像這樣:類變量

public class MyClass 
{ 
     public string String1; 
     public string String2; 

     public MyClass() 
     { 

     } 

     public MyClass(string Json) 
     { 

     } 
} 

如果該類不帶參數的實例,它只是帶回一個空的對象。然而,當我通過一個JSON字符串到構造函數我想將所有屬性設置爲等於它們在JSON中的值。

我已經這樣做了使用JSON.NET由Newtonsoft類之外,這樣的:現在

string JsonArray = Base64.Decode(HttpContext.Current.Request.QueryString["songinfo"]); 
MyClass tmp = JsonConvert.DeserializeObject<MyClass>(JsonArray); 
MyClass InstantiatedClass = tmp; 

InstantiatedClass是完全填充的對象。但是,我想在構造函數本身內實現這一目標,但我想不出一種辦法..

我試過像設置this = JsonConvert.DeserializeObject<MyClass>(Json)的東西,但當然,this是隻讀的。

我知道我可以通過解析Json並將每個變量設置爲相應的JSON屬性值來實現,但我想這樣做,因爲它更乾淨。

+0

當然,如果'MyClass'是一個'struct',那麼'this = JsonConvert.DeserializeObject(Json);'的方法就行得通了。 –

+0

唯一的方法是在構造函數中創建第二個實例,然後使用反射來克隆所有屬性。答案中提到的靜態工廠方法與您所要求的相比是次好的,甚至更好/更清潔的解決方案。 – Mark

+0

我對您的問題沒有回答,似乎您已經有一些,但我想更正您的術語。你不「實例化變量」。通過創建該類型的對象,唯一可以實例化的就是一個類型。你想要做的是「初始化」這些變量,一個對象是一個類型的實例。 – jmcilhinney

回答

4

你不能從構造函數中完成它。你可能會內MyClass考慮工廠方法,像這樣:

public static MyClass Deserialize(string json) 
{ 
    return JsonConvert.DeserializeObject<MyClass>(json); 
} 

一個構造函數不返回任何東西,和你說this是隻讀的。因此,如果沒有(如您所述)手動解析JSON並初始化該實例中的不同變量,那麼在構造函數中執行它是不可能的。

工廠方法可能是你正在尋找的。

+3

注意:如果採取這種方法,您可能希望使構造函數爲private,以便該對象只能通過工廠方法構造。 –

3

你可以做某事像這樣:

public class MyClass 
{ 
    public string String1; 
    public string String2; 

    public MyClass() 
    { 

    } 

    public static MyClass Instance(string json) 
    { 
     return new JsonConvert.DeserializeObject<MyClass>(json); 
    } 
} 

但是,這只是某種解決辦法的你想要達到的目標。事實上沒有可能通過構造函數直接執行此操作。

0
public MyClass(string Json) 
{ 
    MyClass tmp = (MyClass) JsonConvert.DeserializeObject<MyClass>(Json); 

    this.String1 = tmp.String1; 
    this.String2 = tmp.String2; 
} 

請注意,您可以訪問MyClass方法中MyClass的所有私有成員。