我需要自定义列表。
我已经定义了这样的界面......
public interface IMyList: IList<IMyListItem>
{
// Stuff
}
并且具体类定义如下......
public class MyList : List<IMyListItem>, IMyList
{
}
一切都很好。
直到,我尝试将某些内容反序列化为MyList
的实例。当我这样做的时候......
var result = JsonConvert.DeserializeObject<MyList>(someString)
JSon.NET抱怨这条消息......
Message =无法创建IMyListItem类型的实例。 Type是接口或抽象类,无法实例化。
我得到了消息告诉我的内容,但我无法解决如何处理我的类和接口定义。
我可以将MyList
的定义更改为public class MyList : List<MyListItem>
,但接口依赖于具体的类,对我来说更重要的是,它创建了一个循环引用(我的模型和定义的接口)它们在不同的组件中。)
我只是做错了吗?在不同的程序集中使用Interfaces和Class实现是不合理的吗?是否有我应该使用的技术/模式,我不是?
答案 0 :(得分:1)
如何使用具有继承限制的泛型类型?
public interface IMyList<T>: IList<T> where T : IMyListItem
{
// Stuff
}
public class MyList : List<MyListItem>, IMyList<MyListItem>
{
}
......并像这样使用它:
var result = JsonConvert.DeserializeObject<MyList>(someString)
您的界面将不会基于具体的类,而是基于对另一个接口的继承限制。另一方面,你的MyList类不一定是接口列表(IMyListItem),而是一个MyListItems列表。
答案 1 :(得分:0)
有些人向我指出了其他答案,我将检查所有答案,但在这个具体实例中,我意识到我可以改变调用来反序列化对象......
var result = JsonConvert.DeserializeObject<MyList>(someString)
到
var result = new MyList();
result.AddRange(JsonConvert.DeserializeObject<List<MyListEntry>>(someString));