What is the correct way to check if an IEnumerable<T>
is generated by the
yield keyword ?
Sample :
public IEnumerable<int> GetMeSomeInts()
{
// Unknown implementation
}
Somewhere :
IEnumerable<int> someInts = GetMeSomeInts() ;
if (someInts is generatedbyayield) // <- What should be this condition ?
someInts = someInts.ToList() ;
The state machine created by the yield keyword was not designed to be "detectable". If you find a way to detect it, you will have to rely on some implementation-specific hints (such as a specific pattern of the type name; some examples are given in the comments of your question), which are not part of the C# spec and, thus, might change at any time.
Thus, there is no correct way to check if an IEnumerable<T>
is generated by the yield keyword. I would argue that the correct way is not to check. That's what interfaces are for: They hide the implementation.
Since you did not mention why you want to find out whether the IEnumerable was generated by the yield keyword, I will make a wild guess and assume that what you actually wanted to ask was:
How can I materialize an IEnumerable if it has not been materialized yet?
That question has been answered already:
I wouldn't necessarily say it's the correct way, but A way is:
someInts.GetType().Name.Contains("<Yielded>")
This is probably fairly reliable since this name is very abnormal. Since you're relying on deep internals it could change between any .NET release, although i feel it probably wouldn't/hasn't.
If you use this, make sure to keep a unit test to sanity check it. Such that if the internals do change, your unit test will fail on the build server.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With