簡體   English   中英

為什么我的事件處理程序以<> c為目標? 還 - 什么甚至<> c?

[英]Why is my event handlers target <>c? Also - What even is <>c?

規范創建一個最小的,完整的和可驗證的代碼集,請參閱以下內容:

using System;
using System.Data;
using System.Linq;
using System.Windows;

namespace WhatIsThis{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application {
        private void Application_Startup( object sender, StartupEventArgs e ) {
            Foo.Bar += ( S, E ) => Console.WriteLine( "Do Something!" );
        }

        protected override void OnActivated( EventArgs e ) {
            base.OnActivated( e );
            Foo.OnBar( );
        }
    }

    public static class Foo {
        private static event EventHandler _Bar;
        internal static void OnBar( ) {
            if ( _Bar != null )
                _Bar.Extension( null, EventArgs.Empty );
        }

        public static event EventHandler Bar {
            add { _Bar += value; }
            remove { _Bar -= value; }
        }

        private static void Extension(
            this EventHandler eH,
            object sender,
            EventArgs e ) {
            foreach(
                EventHandler evnt in
                    eH.GetInvocationList(
                    ).Cast<EventHandler>( ) ) {
                Console.WriteLine( evnt.Target );
                evnt( sender, e );
            }
        }
    }
}

我正在使用事件處理程序進行擴展以完成一些事情,我需要能夠識別事件處理程序所針對的內容(基本上,如果它是一個System.ComponentModel.ISynchronizeInvoke類型對象(用於處理WinForms應用程序)或者它是一個System.Windows.Threading.DispatcherObject(用於處理WPF應用程序))。

當我看evnt.TargetExtension方法中,我看到它是WhatIsThis.App.<>c

我已經嘗試將它作為幾個不同的東西(包括一個Action)進行投射,但它總是以null形式出現......這沒有用

這是什么類型的對象?

這是什么類型的對象?

該名稱由編譯器生成。 我已經發布了一些關於編譯器當時使用的名稱模式的注釋:

哪里可以了解VS調試器'魔術名'

請注意,這些可能會隨時更改,自2010年我寫完以來,我沒有更新答案。正如評論所述,之后添加了更多魔術名稱模式。

在你的情況下,雖然它是一個“c”,這是一個為lambda生成的閉包類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM