2016-08-12 7 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文字列を取得しますeと私はそれを自分のタイプに逆直列化したい。しかし、__タイプだけがjson文字列の中でそのタイプに役立ちます。私は何を意味することは、私がの代わりに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エンティティを変換し、デシリアライザに渡す必要があります。しかし、私はこの反省について検査し続けます。ありがとう。 – ibubi

+0

コードサンプルで回答を更新し、さらに適切なリンク(MakeGenericMethodメソッドについて)を変更しました。うまくいけば助かります – Kel

+0

自分のクラス構造を自分の目的に合わせて変更する必要がありました。 jsonで変換されるエンティティの種類はjsonに保持されていたので、それはパラドックスです。型を取得するためにjsonを文字列メソッドで解析する必要があるため、クラス構造を変更することにしました。しかし、私はこの方法を使って目的を達成し、トピックをカバーしているので、私はこのポストを答えとしてマークしました。とにかくありがとう。 – ibubi

関連する問題