检查是否生成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() ;
答案 0 :(得分:5)
由yield关键字创建的状态机不是设计为&#34;可检测的&#34;。如果您找到一种方法来检测它,您将不得不依赖于某些特定于实现的提示(例如类型名称的特定模式;您的问题的注释中给出了一些示例),这些不是C#的一部分规范,因此,可能随时改变。
因此,没有正确的方法来检查yield关键字是否生成IEnumerable<T>
。我认为正确的方式不是检查。这是什么接口:他们隐藏实现。
由于你没有提到为什么你想知道IEnumerable是否是由yield关键字生成的,我会猜测并假设你实际我想问的是:
如果IEnumerable尚未实现,我怎样才能实现?
这个问题已经得到了回答:
答案 1 :(得分:1)
我不一定会说这是正确的方式,但 A 方式是:
someInts.GetType().Name.Contains("<Yielded>")
这可能相当可靠,因为这个名字非常不正常。由于你依赖于深层内部,它可能会在任何.NET版本之间发生变化,尽管我觉得它可能不会/没有。
如果您使用此功能,请务必进行单元测试以进行健全性检查。这样,如果内部确实发生了变化,那么单元测试将在构建服务器上失败。