3

カスタム (および汎用) Json.net シリアライザーを実装していて、助けが必要な道のりにぶつかりました。

デシリアライザーがインターフェイスであるプロパティにマッピングしている場合、どのような種類のオブジェクトを構築してデシリアライズし、インターフェイス プロパティに配置するかを決定するにはどうすればよいでしょうか。

私は次のものを持っています:

[JsonConverter(typeof(MyCustomSerializer<foo>))]
class foo 
{
    int Int1 { get; set; }
    IList<string> StringList {get; set; }
}

私のシリアライザーはこのオブジェクトを適切にシリアライズしますが、それが戻ってきて、json パーツをオブジェクトにマップしようとすると、JArray とインターフェースができてしまいます。

私は現在、リストのような列挙可能なものをインスタンス化しています

 theList = Activator.CreateInstance(property.PropertyType);

これは逆シリアル化プロセスで動作するように作成しますが、プロパティが IList の場合、インターフェイスをインスタンス化できないというランタイムの苦情が (明らかに) 発生します。

では、このような場合に作成する具象クラスのタイプをどのように知るのでしょうか?

ありがとうございました

4

1 に答える 1

2

デフォルトであると思われるタイプにインターフェースをマップする辞書を作成できます(「インターフェースのデフォルトタイプ」は、言語で定義された概念ではありません)。

var defaultTypeFor = new Dictionary<Type, Type>();
defaultTypeFor[typeof(IList<>)] = typeof(List<>);
...
var type = property.PropertyType;
if (type.IsInterface) {
    // TODO: Throw an exception if the type doesn't exist in the dictionary
    if (type.IsGenericType) {
        type = defaultTypeFor[property.PropertyType.GetGenericTypeDefinition()];
        type = type.MakeGenericType(property.PropertyType.GetGenericArguments());
    }
    else {
        type = defaultTypeFor[property.PropertyType];
    }
}
theList = Activator.CreateInstance(type);

(このコードは試していません。問題が発生した場合はお知らせください。)

于 2012-11-03T16:48:57.597 に答える