2016-11-15 7 views
0

Json文字列をデバッグモードでオブジェクトにデシリアライズしようとしていますが、System.RuntimeTypeに宣言されたプロパティの定義が含まれていないなど、 ...System.RuntimeTypeに宣言されたプロパティの定義が含まれていません

任意のヘルプは

public T DeserializeJSon<T>(string jsonString) 
    { 
     dynamic dT = typeof(T); 

     if (dT.Name.EndsWith("List")) 
      dT = dT.DeclaredProperties[0].PropertyType.GenericTypeArguments[0]; 

     DataContractJsonSerializerSettings settings = new DataContractJsonSerializerSettings() 
     { 
      DateTimeFormat = new DateTimeFormat(DateTimeFormat), 
      UseSimpleDictionaryFormat = true 
     }; 
     DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T), settings); 
     MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); 
     T obj = (T)ser.ReadObject(stream); 
     stream.Dispose(); 

     return obj; 
    } 
+0

なぜ 'dyanmic'を使うのですか?' typeof(T) 'は* allways *が' System.Type'のインスタンスを返すので、 'dynamic'ではなくtypeを使うべきです。 – HimBromBeere

+0

@HimBromBeereもっと具体的にお試しください。このようにしてみてください。タイプdT = typeof(T); DeclaredPropertiesはエラーを返す拡張メソッドです –

答えて

0

DeclaredPropertiesをいただければ幸いですSystem.TypeInfoの、すべてではないdyanmicSystem.Typeと少なくとものメンバーです。

したがって、単に代わりにこれを書く:

Type dt = typeof(T); 
if (dT.Name.EndsWith("List")) 
    dT = dT.GetTypeInfo().DeclaredProperties.First().PropertyType.GenericTypeArguments[0]; 

は、私は強くあなたが本当に(ここではケースをisn'tた)それを必要としない限り、dyanmicを使用しないことをお勧めします。 Dynamicは実際のエラー(存在しないメンバーへのあなたの場合のアクセス)をエラーを見つけるのを困難にするコンパイラではなく、ランタイムにシフトします。もう1つの理由は、がすでにのランタイムタイプtypeof(T)allwaysSystem.Type)を認識していることです。なぜdynamicを使用してこの情報を非表示にする必要がありますか?

+0

Thanks A Ton @HimBromBeereが私の仕事をしました。もう一度dyanmicについての明確な理解を与えてくれてありがとう –

関連する問題