我有以下我无法解决的问题:
我有不同的类,它们都实现了一个名为IProtocol
. 目前,它们被命名为SimpleProtocol
, ParallelProtocol
。我想保留这些对象,所以我使用了 JSON.NET,一切正常。除非我试图反序列化它们,否则当我知道它们应该是什么类型时它可以完美地工作,例如:
SimpleProtocol p = JsonConvert.DeserializeObject<SimpleProtocol>(myJsonData);
但是,我现在处于想要加载 JSON 数据并获得IProtocol
回复的情况,但可以理解的是,JSON 不允许这样做;例如,这样的事情不起作用:
IProtocol p1 = JsonConvert.DeserializeObject<IProtocol>(myJsonData); // does not work
IProtocol p2 = (IProtocol)JsonConvert.DeserializeObject(myJsonData); // also, does not work
因此,查找API我发现了这个方法签名:
public static Object DeserializeObject(
string value,
Type type
)
这看起来就像我需要的东西,所以尝试将类型保存在字符串中并检索它:
// test
Type protocolType = Type.GetType("MyApp.Protocols.SimpleProtocol");
IProtocol p1 = JsonConvert.DeserializeObject(myJsonData, protocolType);
我收到一个错误,无法将 aNewtonsoft.Json.Linq.JObject
转换为IProtocol
. 这很奇怪,我不知道如何解决。
在泛型方法中传递Type对象是不可能的,所以我基本上卡在这里。有没有办法解决这个问题,最好不使用反射?在我看来,这是一个完全正常的用例。
我能做的,但对我来说似乎有点“脏”,是创建一个简单的包装类,其中包含一个 IProtocol 实例并序列化/反序列化?