Correct way to check if IEnumerable is created by a yield keyword

后端 未结 2 1362
余生分开走
余生分开走 2020-12-11 08:25

What is the correct way to check if an IEnumerable is generated by the yield keyword ?

Sample :

public IEnumerable

        
相关标签:
2条回答
  • 2020-12-11 09:07

    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:

    • Is there a way to Memorize or Materialize an IEnumerable?
    0 讨论(0)
  • 2020-12-11 09:09

    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.

    0 讨论(0)
提交回复
热议问题