2016-08-12 1 views
4

프로젝트에서이 문제가 떠올랐다. 테이블의 json 문자열이있다. 직렬화 된 엔티티이다.

는 JSON타입을 알지 못하는 비 직렬화 엔티티

{ 
"Entity":{ 
"__type":"Book:#Definition", 
"BookId":3, 
"BookName":"Meloon Dreams", 
"Type":2, 
"Price":35 
} 
} 

예약 클래스

namespace Definition 
{ 
    [DataContract] 
    public class Book : IEntity 
    { 
     [DataMember] 
     public int BookId { get; set; } 

     [DataMember] 
     public string BookName { get; set; } 

     [DataMember] 
     public BookType Type { get; set; } 

     [DataMember] 
     public decimal Price { get; set; } 
    } 
} 

워크 플로 클래스

public class Workflow 
{ 
    public int WorkflowId { get; set; } 

    public IEntity Entity { get; set; } 
} 

그래서, 컨트롤러 클래스에서 내가 TABL에서 JSON 문자열을 얻을 전자와 나는 그것을 자신의 타입으로 비 직렬화하고 싶다. 그러나 json 문자열 안에 __type 만 입력하면됩니다. 내 말은 내가 대신 IEntity

예약을 둘 필요가

workflow.Entity = Serializer.JsonDeserialize<IEntity>(jsonString); 

인 클래스 구조를 변경하지 않고 가능성이있다, 또는 JSON에서 유형을 얻을로 변환 할 수 있습니다 대신 IEntity를 입력하고 입력하십시오.

답변

0

질문을 올바르게 이해하면 제네릭 형식을 동적으로 지정하는 제네릭 클래스를 인스턴스화해야합니다. 반사와 함께 할 수 있습니다 :

// Load type name from json - you'll need to implement LoadTypeFromJson() method to load type name string from json 
string typeName = LoadTypeFromJson(); 

// Get .Net Type by type name 
Type entityType = Type.GetTypeByName(typeName); 

// Get Serializer type 
Type serializerType = typeof(Serializer); 

// Get MethodInfo for Deserialize method of Serializer class 
MethodInfo deserializeMethodInfo = serializerType.GetMethod("Deserialize"); 

// Construct Serializer.Deserialize<IEntity> method for specific IEntity 
MethodInfo constructedDeserializeMethod = deserializeMethodInfo.MakeGenericMethod(entityType); 

// Call constructed method 
constructedDeserializeMethod.Invoke(null, new object[] { jsonString }); 

중요한 부분은 여기에서 문제는 조금 도움이 MethodInfo.MakeGenericMethod method

+0

하지만, 내 프로젝트에서 내가 제네릭 클래스를 사용하고 있지 않다, 그것은 일반적인 방법이다. 내 워크 플로 엔터티 속성에 제네릭 형식이 아닌 명시 적 형식이 필요하다는 것을 의미합니다. 그래서 json 엔터티 자체 형식으로 변환하고 deserializer 전달해야합니다. 그러나 나는이 반성에 대해 계속 점검 할 것이다. 감사. – ibubi

+0

코드 샘플을 사용하여 대답을 업데이트하고 더 적절한 것으로 링크를 변경했습니다 (MakeGenericMethod 메서드). - 도움이 되었으면 좋겠어요. – Kel

+0

제 목적을 위해 클래스 구조를 변경해야했습니다. json에서 변환 될 내 엔티티가 json에서 유지되는 유형이기 때문에 : 역설이므로 json을 문자열 메소드로 파싱하여 유형을 가져와야하므로 클래스 구조를 변경하기로 결정했습니다. 그러나 나는 그 방법으로 나의 목적을 달성했고 주제를 다루기 때문에이 게시물을 대답으로 표시했습니다. 어쨌든 고마워. – ibubi