列表,接口和对象

时间:2015-12-17 12:56:30

标签: c# design-patterns interface

我需要自定义列表。

我已经定义了这样的界面......

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实现是不合理的吗?是否有我应该使用的技术/模式,我不是?

2 个答案:

答案 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));