2014-01-27 5 views
2

내가 간단한 클래스과 같이이 : 클래스는 매개 변수없이 인스턴스화하는 경우인스턴스화 클래스 변수

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

     public MyClass() 
     { 

     } 

     public MyClass(string Json) 
     { 

     } 
} 

난을 통과 할 때, 그냥, 그러나 .. 빈 객체를 찾아온다 생성자에 대한 JSON 문자열 JSON에서 모든 속성을 해당 값과 같게 설정하려고합니다. 내가 생성자 자체 내에서이를 싶습니다

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

InstantiatedClass 지금은 완전히 채워진 오브젝트입니다 .. 그러나 :

나는 다음과 같이 Newtonsoft에 의해 JSON.NET를 사용하여 클래스의 외부에서 수행 한 ,하지만 그것을 할 수있는 방법을 알아낼 수 없습니다 ..

나는 this = JsonConvert.DeserializeObject<MyClass>(Json) 설정과 같은 것을 시도했지만 물론, this은 읽기 전용입니다.

나는 JSON을 구문 분석하고 각 변수를 적절한 JSON 속성 값으로 설정하여이를 수행 할 수 있음을 알고 있지만 클리너이므로이 방법으로 수행하려고합니다.

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

    public MyClass() 
    { 

    } 

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

을 그러나 이것은 당신이 달성하려는 작업에 해결 단지 어떤 종류 :

+0

물론 'MyClass'가'struct' 인 경우, this = JsonConvert.DeserializeObject (Json);을 사용하는 것이 효과적이었을 것입니다. –

+0

생성자 안에 두 번째 인스턴스를 만든 다음 리플렉션을 사용하여 모든 속성을 복제하는 유일한 방법이 있습니다. 답변에 언급 된 정적 팩토리 메소드는 사용자가 묻는 것과 비교하여 차선책이며 더 나은/더 나은 솔루션입니다. – Mark

+0

귀하의 질문에 대한 답변이 없기 때문에 귀하는 이미 일부 내용이 있지만 귀하의 용어를 수정하고 싶다고 생각됩니다. 변수를 "인스턴스화"하지 마십시오. 인스턴스화 할 수있는 유일한 유형은 해당 유형의 오브젝트를 작성하여 유형입니다. 당신이하고 싶은 것은 타입의 인스턴스 생성 인 객체를 가지고 그 변수들을 "초기화"하는 것입니다. – jmcilhinney

답변

4

생성자에서 수행 할 수 없습니다. 아무것도 반환하지 않습니다

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

생성자를, 당신은 this을 언급 한 바와 같이 읽기 전용입니다 : 당신은 너무 같은 MyClass 내 공장 방법을 고려할 수 있습니다. 따라서 생성자에서 JSON을 수동으로 구문 분석하고 해당 인스턴스 내의 여러 변수를 초기화하지 않으면 (실제로 사용자가 명시한대로) JSON을 구문 분석하지 않으면 실제로는 불가능합니다.

아마도 여러분이 찾고있는 방법은 아마도 공장 방법 일 것입니다.

+3

참고 :이 방법을 사용하면 생성자가 private 메소드를 사용하여 객체가 factory 메소드를 통해서만 구성 될 수 있습니다. –

3

이 같은 STH을 할 수 있습니다. 실제로 생성자를 통해 직접이 작업을 수행 할 가능성은 없습니다.

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

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

참고로 MyClass 메서드 내에서 MyClass의 모든 개인 멤버에 액세스 할 수 있습니다.