문제

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 };
    }
도움이 되었습니까?

해결책

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;
                        }
                    }
                }
            }
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top