【发布时间】:2018-01-08 17:28:10
【问题描述】:
我有一个实际上是 IEnumerable 包装器的类:
public class MyThings : IEnumerable<Thing>
{
}
我像这样创建Thing 的枚举:
var things = new [] {new Thing (), new Thing()};
据此,我想创建一个MyThings 的实例——类似于:
var myThings = things as MyThings;
这当然行不通。
一种解决方案是将Add 方法添加到MyThings 和内部List<Thing>
public class MyThings : IEnumerable<Thing>
{
private readonly List<Thing> list = new List<Thing>();
public MyThings this[int index]
{
get { return list[index]; }
set { list.Insert(index, value); }
}
public IEnumerator<Thing> GetEnumerator()
{
return list.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public void Add(Thing thing)
{
list.Add(thing);
}
}
这样,我可以通过自动初始化来创建它,例如:
var things = new MyThings {new Thing (), new Thing()};
但这似乎不是很优雅。
有没有办法铸造?
编辑: 本着“你为什么要这样做”的精神
这样我们就可以将自定义 JsonConverter 应用于整个类型 (MyThings)
【问题讨论】:
-
呃,没有 cmets 的投票者在这个网站上的情况最糟糕。
-
我之前没有在 .NET 中使用过 Json,但我认为大多数 Json 序列化框架都会支持开箱即用的集合。只要有
Thing的转换器,你就不能简单地序列化Thing[]、IEnumerable<Thing>或IList<Thing>吗? -
这是因为您想在一个地方以一种方式序列化 JSON,但在另一个地方以不同的方式序列化 JSON,而底层类型仍然相同?
-
是的,这有点难以解释(并且超出了这个问题的范围) - 但基本上我们的
Thingcollection 以特定方式存储在 json 中(第三方要求) - 我们的类具有这种类型的属性,都需要以相同的方式序列化,而不是用 JsonConverter 装饰每个属性,我们考虑拥有这个包装类 - 这几乎工作得很好跨度> -
@Alex Gotcha。将包装类埋在
Internal命名空间中可能是个好主意,以阻止人们在您描述的有限范围之外使用它。
标签: c# generics collections casting