C# 铸造一个IEnumerable<;T>;到包装类
我有一个类实际上是IEnumerable包装器:C# 铸造一个IEnumerable<;T>;到包装类,c#,generics,collections,casting,C#,Generics,Collections,Casting,我有一个类实际上是IEnumerable包装器: public class MyThings : IEnumerable<Thing> { } 在此基础上,我想创建一个MyThings的实例,大致如下: var myThings = things as MyThings; 这当然不行 一种解决方案是将add方法添加到MyThings和内部列表 但这看起来不太优雅 有铸造的方法吗 编辑: 本着“你到底为什么要这么做”的精神 这样我们就可以将自定义的JsonConverter应用于
public class MyThings : IEnumerable<Thing>
{
}
在此基础上,我想创建一个MyThings
的实例,大致如下:
var myThings = things as MyThings;
这当然不行
一种解决方案是将add
方法添加到MyThings
和内部列表
但这看起来不太优雅
有铸造的方法吗
编辑:
本着“你到底为什么要这么做”的精神
这样我们就可以将自定义的JsonConverter
应用于整个类型(MyThings
)数组,从:
var things = new [] {new Thing (), new Thing()};
是一个数组(Thing[]
)。它将始终是一个数组,除了一个数组之外没有其他内容。它将不是一个神话
现在,您可以添加一个转换运算符,允许在它们之间进行显式或隐式转换,但很可能您所做的只是添加一个不必要的中间数组分配。坦率地说,我认为您的Add
添加以及集合初始值设定项语法是您最好的选择
但是,您也可以添加:
public static implicit operator MyThings(Thing[] things) {
// your logic here
}
然后这就行了:
var arr = new[] { new Thing(), new Thing() };
MyThings things = arr;
或者如果您使用显式
而不是隐式
,则:
var arr = new[] { new Thing(), new Thing() };
MyThings things = (MyThings)arr;
如果MyThings
只是包装数组,并且您要将其存储在字段中而不复制它,则运算符方法可能是一个好主意,即如果您的实现基本上是:
this._things = things;
我不喜欢这种转换,因为很简单的一个事实是,无法立即确定生成的包装器是否实际上是一个包装器。它是包装原始数组还是创建副本?除非你深入研究
神话的来源,否则就不清楚了。我还质疑MyThings
的可变性的价值,但这是OP的设计决定,不是你的。呃,没有评论的投票人在这个网站上做了最糟糕的事情。我以前没有在.NET中做过Json,但我认为大多数Json序列化框架都会支持开箱即用的集合。你不能简单地序列化一个东西[]
,IEnumerable
,或者IList
,只要有一个东西的转换器就行了吗?这是因为你想在一个地方以一种方式序列化JSON,而在另一个地方以另一种方式序列化JSON,而底层类型仍然是一样的吗?是的,这很难解释(这超出了这个问题的范围)-但基本上我们的东西的集合是以json(第三方需求)的特定方式存储的-我们有一些类具有这种类型的属性,所有这些属性都需要以相同的方式序列化,我们没有用JsonConverter来修饰每个属性,而是考虑使用这个包装类,它几乎可以正常工作well@Alex明白了。将包装器类埋在内部命名空间中以阻止pe可能是个好主意禁止在您描述的有限范围之外使用它。
var arr = new[] { new Thing(), new Thing() };
MyThings things = arr;
var arr = new[] { new Thing(), new Thing() };
MyThings things = (MyThings)arr;
this._things = things;