[英]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.Target
在Extension
方法中,我看到它是WhatIsThis.App.<>c
。
我已經嘗試將它作為幾個不同的東西(包括一個Action)進行投射,但它總是以null形式出現......這沒有用
這是什么類型的對象?
這是什么類型的對象?
該名稱由編譯器生成。 我已經發布了一些關於編譯器當時使用的名稱模式的注釋:
請注意,這些可能會隨時更改,自2010年我寫完以來,我沒有更新答案。正如評論所述,之后添加了更多魔術名稱模式。
在你的情況下,雖然它是一個“c”,這是一個為lambda生成的閉包類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.