我有以下接口:
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使用
DeserializeObject<IInterface<Sample>>(js_object_string)
对上述JSON对象进行反序列化。
如何为这个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);
}
}
IInterface<M>
反序列化为Implementation<M>
? - dbcIInterface
只有一个名为Implementation
的实现,我确信它会一直保持这样。至于为什么我需要一个接口的问题,那是一个很长很长的故事,超出了本问题的范围。 - AbbasFaisal