检查IEnumerable <t>是否由yield关键字创建的正确方法

时间:2015-12-09 16:17:46

标签: c# ienumerable

检查是否生成IEnumerable<T>的正确方法是什么? yield关键字?

示例:

public IEnumerable<int> GetMeSomeInts() 
{
   // Unknown implementation
}

某处:

IEnumerable<int> someInts = GetMeSomeInts() ;

if (someInts is generatedbyayield) // <- What should be this condition ? 
      someInts = someInts.ToList() ; 

2 个答案:

答案 0 :(得分:5)

由yield关键字创建的状态机不是设计为&#34;可检测的&#34;。如果您找到一种方法来检测它,您将不得不依赖于某些特定于实现的提示(例如类型名称的特定模式;您的问题的注释中给出了一些示例),这些不是C#的一部分规范,因此,可能随时改变。

因此,没有正确的方法来检查yield关键字是否生成IEnumerable<T>。我认为正确的方式不是检查。这是什么接口:他们隐藏实现。

由于你没有提到为什么你想知道IEnumerable是否是由yield关键字生成的,我会猜测并假设你实际我想问的是:

  

如果IEnumerable尚未实现,我怎样才能实现?

这个问题已经得到了回答:

答案 1 :(得分:1)

我不一定会说这是正确的方式,但 A 方式是:

someInts.GetType().Name.Contains("<Yielded>")

这可能相当可靠,因为这个名字非常不正常。由于你依赖于深层内部,它可能会在任何.NET版本之间发生变化,尽管我觉得它可能不会/没有。

如果您使用此功能,请务必进行单元测试以进行健全性检查。这样,如果内部确实发生了变化,那么单元测试将在构建服务器上失败。