2014-02-07 4 views
0

목록 및 사전을 비롯한 다양한 유형의 속성이 많은 BaseClass라는 클래스가 있습니다. 이 클래스에는 속성이 몇 개 더있는 3 개의 파생 클래스가 있습니다. 이 클래스는 큰 응용 프로그램에서 이미 사용되고 있으므로 디자인 변경은 현재로서는 불가능합니다.기본 개체에서 개체의 속성 값을 채우는 방법

그래서 파생 클래스 등이있다 : 나는 기본 클래스에있는 속성을 기반으로 이러한 클래스를 탈 직렬화 할 때

public class DerivedClass1 : BaseClass 
{ 
    public string PropertyOne { get; set; } 
} 

public class DerivedClass2 : BaseClass 
{ 
    public string PropertyTwo { get; set; } 
} 

public class DerivedClass3 : BaseClass 
{ 
    public string PropertyThree { get; set; } 
} 

나는 다형성을 수행해야합니다. 따라서 Json 객체가 BaseClass로 deserialize 될 때마다 속성 값을 확인하고 올바른 concrete 클래스를 만들어야합니다.

var deserializedObjet = Serializer.Deserialize(jsonString); 
switch(deserializedObjet.ConcreteType) 
{ 
    case 1: 
     return new DerivedClass1().PopulateFrom(deserializedObjet); 
    case 2: 
     return new DerivedClass2().PopulateFrom(deserializedObjet); 
    case 3: 
     return new DerivedClass3().PopulateFrom(deserializedObjet); 
} 

파생 클래스는 JSON 문자열에서 데이터가없는 이렇게하려면 나는 그래서 나는이 방법으로 호출 할 수 있습니다 PopulateFrom (이 BaseClass로 인스턴스 BaseClass로 fromObject) 등의 방법이 필요합니다. 그들이하는 일은 동일한 데이터를 얻지 만 다른 작업을 수행하거나 다른 방식으로 표현하기 때문에 Json을 BaseClass로 deserialize해야합니다.

StackTrace.Text에는 유사한 방법이 있지만 그 방법은 무료가 아닌 버전 4로 추가되었습니다.

+0

JSON을 'BaseClass'로 직렬화 해제하면 파생 클래스의 속성에 대한 일련 값이 무시됩니다. 어떤 클래스인지 파악한 후에 올바른 클래스로 다시 deserialize해야합니다. –

+0

죄송합니다. 문제를 제대로 언급하지 않았을 수 있습니다. 파생 클래스는 Json 문자열에 데이터가 없습니다. 그들이하는 일은 동일한 데이터를 얻지 만 다른 작업을 수행하거나 다른 방식으로 표현하는 것입니다. – Aref

답변

0

필수 클래스 인스턴스를 만들고 현재 기본 인스턴스의 속성 값을 반영하여 새로 만든 인스턴스 인스턴스로 복사 할 수 있습니다.

static void PopulateFrom(this BaseClass dest, BaseClass source) //extension method will not modify legacy code and can be added to the any static class 
{ 
    var properties = source.GetType().GetProperties(public only); 
    foreach (var pi in properties) 
     if (pi.CanRead && pi.CanWrite) 
      pi.SetValue(dest, pi.GetValue(source, null), null); //this will work only for classes inherited from BaseClass 
} 

은 또한 당신은 BaseClass로에 할당 연산자를 무시하고 그것으로 속성 값을 복사 할 수 있습니다 (이 컴파일하기 전에 해결해야 할) 아래 샘플을 찾아주세요.

+0

목록 및 사전에도이 작업이 가능합니까? – Aref

+0

@Aref sure! 예를 들어 소스 객체와 동일한 List1 (또는 Array2) 속성을 가리키는 List1 (또는 Array2) 속성이있는 대상 객체를 가져옵니다. 그러나 사전을 serialize 할 수 없다는 것을 알고 싶습니다. 그리고 가짜 KeyValuePair [] 속성을 추가하여 XmlSerializer로 serialize 된 사전을 가져와야합니다. – oleksa

관련 문제