我有以下界面:
public interface IInterface<out M>
{
M Message { get; }
string Str { get; }
}
及其实现:
public class Implementation<M> : IInterface<M>
{
public M Message;
public string Str;
public Implementation(M message, string str)
{
Message = message;
Str = str;
}
M IInterface<M>.Message => this.Message;
string IInterface<M>.Str => this.Str;
}
这是一个示例 M 类:
public class Sample
{
public int X;
}
这是我从 javascript 客户端传递的示例 JSON:
{ "Message" : { "X": 100 }, "Str" : "abc" }
现在有一些遗留/外部代码(我无法更改)尝试使用 Json.Net 反序列化上述 JSON 对象DeserializeObject<IInterface<Sample>>(js_object_string)
。
我怎样才能为这个IInterface
接口编写一个处理其通用参数的 JsonConverter M
。互联网上的大多数解决方案仅适用于编译时已知的类型。
我尝试了下面的代码(我不完全理解),但外部代码认为反序列化的对象不是IInterface
.
static class ReflectionHelper
{
public static IInterface<T> Get<T>()
{
var x = JsonConvert.DeserializeObject<T>(str);
IInterface<T> y = new Implementation<T>(x, "xyz");
return y;
}
}
class MyConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(IInterface<>));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var w = Newtonsoft.Json.Linq.JObject.Load(reader);
var x = typeof(ReflectionHelper).GetMethod(nameof(ReflectionHelper.Get)).MakeGenericMethod(objectType.GetGenericArguments()[0]).Invoke(null, new object[] { });
return x;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; // otherwise I get a circular dependency error.
serializer.Serialize(writer, value);
}
}