Question

Would some kind person help me sort out the output of .Net Reflector v6.5 that does not compile? I think that the symbols are out of whack but global search and replace might fix that. I don't get the odd class definition. Ideas?

    [CompilerGenerated]
    private sealed class <ApplicationTaskIterator>d__0 : IEnumerable<ApplicationTask>, IEnumerable, IEnumerator<ApplicationTask>, IEnumerator, IDisposable
    {
        private int <>1__state;
        private ApplicationTask <>2__current;
        public SessionMetrics <>3__sm;
        public Dictionary<int, ThreadMetrics> <>7__wrap3;
        public Dictionary<int, ThreadMetrics>.ValueCollection.Enumerator <>7__wrap4;
        public ApplicationTask <currentTask>5__1;
        public ThreadMetrics <tm>5__2;
        public SessionMetrics sm;

        [DebuggerHidden]
        public <ApplicationTaskIterator>d__0(int <>1__state)
        {
            this.<>1__state = <>1__state;
        }

        private bool MoveNext()
        {
            try
            {
                switch (this.<>1__state)
                {
                    case 0:
                        this.<>1__state = -1;
                        Monitor.Enter(this.<>7__wrap3 = ThreadMetrics._allThreadMetrics);
                        this.<>1__state = 1;
                        this.<>7__wrap4 = ThreadMetrics._allThreadMetrics.Values.GetEnumerator();
                        this.<>1__state = 2;
                        while (this.<>7__wrap4.MoveNext())
                        {
                            this.<tm>5__2 = this.<>7__wrap4.Current;
                            if ((((this.<tm>5__2._managedThread.ThreadState == System.Threading.ThreadState.Stopped) || object.ReferenceEquals(this.<tm>5__2._managedThread, Thread.CurrentThread)) || ((this.<currentTask>5__1 = this.<tm>5__2.CurrentApplicationTask) == null)) || ((this.sm != null) && !this.<currentTask>5__1.CurrentSessionMetrics.SessionGUID.Equals(this.sm.SessionGUID)))
                            {
                                continue;
                            }
                            this.<currentTask>5__1.Active = !this.<tm>5__2.Suspended;
                            this.<>2__current = this.<currentTask>5__1;
                            this.<>1__state = 3;
                            return true;
                        Label_010C:
                            this.<>1__state = 2;
                        }
                        this.<>1__state = 1;
                        this.<>7__wrap4.Dispose();
                        this.<>1__state = -1;
                        Monitor.Exit(this.<>7__wrap3);
                        break;

                    case 3:
                        goto Label_010C;
                }
                return false;
            }
            fault
            {
                ((IDisposable) this).Dispose();
            }
        }
    }

Used like this:

    internal static IEnumerable<ApplicationTask> ApplicationTaskIterator(SessionMetrics sm)
    {
        return new <ApplicationTaskIterator>d__0(-2) { <>3__sm = sm };
    }
Was it helpful?

Solution

That's simply what the C# compiler transforms a method containing yield return statements to.

If you want to make the code compile, you can either try to decipher what the method is doing and recreate the original version with yield return statements; or you can rename the class and all members to valid C# names.


The original method probably looked like this:

internal static IEnumerable<ApplicationTask> ApplicationTaskIterator(SessionMetrics sm)
{
    lock (ThreadMetrics._allThreadMetrics)
    {
        foreach (var tm in ThreadMetrics._allThreadMetrics.Values)
        {
            if (tm._managedThread.ThreadState != ThreadState.Stopped)
            {
                if (!object.ReferenceEquals(tm._managedThread, Thread.CurrentThread))
                {
                    ApplicationTask currentTask;
                    if ((currentTask = tm.CurrentApplicationTask) != null)
                    {
                        if (sm == null || !currentTask.CurrentSessionMetrics.SessionGUID.Equals(sm.SessionGUID))
                        {
                            currentTask.Active = !tm.Suspended;
                            yield return currentTask;
                        }
                    }
                }
            }
        }
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top