Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 铸造一个IEnumerable<;T>;到包装类_C#_Generics_Collections_Casting - Fatal编程技术网

C# 铸造一个IEnumerable<;T>;到包装类

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应用于

我有一个类实际上是IEnumerable包装器:

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;