2017-10-27 20 views
0

私はカスタムJsonConverterを使用しています。そして、私はオブジェクトの型を取得し、ジェネリックパラメータとして設定する必要があります。実行時に一般的なPatameter Tを設定する方法

public class PagedResultConverter : Newtonsoft.Json.JsonConverter 
    { 
     public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
     { 
      var pagedList = (IPagedList<T>)value; 

      var jsonJObject = new JObject 
      { 
       {"TotalCount", pagedList.TotalCount} 
      } 

      jsonJObject.WriteTo(writer); 
     } 
    } 

マイIPagedList<T>パラメータTtypeof(value)の型になります。しかし、私はプロパティ、インターフェイスのメンバーを取得する必要がありますIPagedList<typeof(value)>

を設定することはできません。

どうすればいいですか?

+1

あなたはできません。すでに気づいているように、 'T'は*コンパイル時*型ですが、* runtime *では実際の型を提供します。あなたは*実行時*であなたが提供するものを*コンパイラがどのように知るべきですか?ただし、https://stackoverflow.com/questions/232535/how-do-i-use-reflection-to-call-a-generic-method – HimBromBeere

+0

をご覧ください。何を達成しようとしていますか?おそらく、あなたがしたいことをする別の方法があります。 – Kote

+0

'typeof(value)'はコンパイル時に 'object'になります。おそらくあなたが意味するのは 'value.GetType()'です。しかし、あなたの問題を助けることはありません。 – nvoigt

答えて

0

コメントで既に述べたように、コンパイラはランタイムで提供する型を推測することはできません。つまり、プログラムを実行するときだけ実際の型を知っているとき、コンパイラがどのようにして正しい情報をpagedListにあらかじめ与えているのでしょうか?

たぶん、あなたは一般的なものから継承ニン、汎用インタフェースを導入することができます:今、あなたは非ジェネリックインターフェイスにデシリアライズされたインスタンスをキャストすることができ

interface IPagedList { int TotalCount { get; set; } } 
interface IPagedList<T> : IPagedList { ... } 

var pagedList = (IPagedList)value; 

をしかし、代わりにWriteJson -method genericを代わりに使用し、そのタイプを反射で提供しないでください。

public override void WriteJson<T>(JsonWriter writer, Tvalue, JsonSerializer serializer) 
{ 
    var pagedList = (IPagedList<T>)value; 
} 

var obj = ... 
var m = typeof(MyClass).GetMethod("WriteJson").MakeGenericMethod(obj.GetType()); 
m.Invoke(instanceOfMyClass, new object[] { myWriter, obj, myerializer }); 
+0

彼は 'WriteJson'ジェネリックを作成できませんでした。なぜなら、コンバータは' Newtonsoft.Json.JsonConverter'の抽象的な 'WriteJson'を正しく実装しないからです。 –

関連する問題