2014-01-27 2 views
2

У меня есть простой класс, например, так:переменного класс Instantiate в конструкторе этого класса

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.

Смежные вопросы