EventHandler<TEventArgs> Delegált

Definíció

Azt a metódust jelöli, amely egy eseményt kezel, amikor az esemény adatokat ad meg.

generic <typename TEventArgs>
public delegate void EventHandler(System::Object ^ sender, TEventArgs e);
generic <typename TEventArgs>
 where TEventArgs : EventArgspublic delegate void EventHandler(System::Object ^ sender, TEventArgs e);
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
public delegate void EventHandler<in TEventArgs>(object? sender, TEventArgs e) where TEventArgs : allows ref struct;
public delegate void EventHandler<TEventArgs>(object? sender, TEventArgs e);
[System.Serializable]
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e) where TEventArgs : EventArgs;
[System.Serializable]
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
type EventHandler<'EventArgs> = delegate of obj * 'EventArgs -> unit
[<System.Serializable>]
type EventHandler<'EventArgs (requires 'EventArgs :> EventArgs)> = delegate of obj * 'EventArgs -> unit
[<System.Serializable>]
type EventHandler<'EventArgs> = delegate of obj * 'EventArgs -> unit
Public Delegate Sub EventHandler(Of TEventArgs)(sender As Object, e As TEventArgs)
Public Delegate Sub EventHandler(Of In TEventArgs)(sender As Object, e As TEventArgs)

Típusparaméterek

TEventArgs

Az esemény által létrehozott eseményadatok típusa.

Paraméterek

sender
Object

Az esemény forrása.

e
TEventArgs

Az eseményadatokat tartalmazó objektum.

Attribútumok

Példák

Az alábbi példa egy eseményt mutat be ThresholdReached. Az esemény egy EventHandler<TEventArgs> meghatalmazotthoz van társítva.

using System;

namespace ConsoleApplication3
{
    public class Program3
    {
        public static void Main()
        {
            Counter c = new(new Random().Next(10));
            c.ThresholdReached += c_ThresholdReached;

            Console.WriteLine("press 'a' key to increase total");
            while (Console.ReadKey(true).KeyChar == 'a')
            {
                Console.WriteLine("adding one");
                c.Add(1);
            }
        }

        static void c_ThresholdReached(object? sender, ThresholdReachedEventArgs e)
        {
            Console.WriteLine("The threshold of {0} was reached at {1}.", e.Threshold,  e.TimeReached);
            Environment.Exit(0);
        }
    }

    class Counter
    {
        private readonly int _threshold;
        private int _total;

        public Counter(int passedThreshold)
        {
            _threshold = passedThreshold;
        }

        public void Add(int x)
        {
            _total += x;
            if (_total >= _threshold)
            {
                ThresholdReachedEventArgs args = new()
                {
                    Threshold = _threshold,
                    TimeReached = DateTime.Now
                };
                OnThresholdReached(args);
            }
        }

        protected virtual void OnThresholdReached(ThresholdReachedEventArgs e)
        {
            ThresholdReached?.Invoke(this, e);
        }

        public event EventHandler<ThresholdReachedEventArgs>? ThresholdReached;
    }

    public class ThresholdReachedEventArgs : EventArgs
    {
        public int Threshold { get; set; }
        public DateTime TimeReached { get; set; }
    }
}
open System

type ThresholdReachedEventArgs(threshold, timeReached) =
    inherit EventArgs()
    member _.Threshold = threshold
    member _.TimeReached = timeReached

type Counter(threshold) =
    let mutable total = 0

    let thresholdReached = Event<_>()

    member this.Add(x) =
        total <- total + x
        if total >= threshold then
            let args = ThresholdReachedEventArgs(threshold, DateTime.Now)
            thresholdReached.Trigger(this, args)

    [<CLIEvent>]
    member _.ThresholdReached = thresholdReached.Publish

let c_ThresholdReached(sender, e: ThresholdReachedEventArgs) =
    printfn $"The threshold of {e.Threshold} was reached at {e.TimeReached}."
    exit 0

let c = Counter(Random().Next 10)
c.ThresholdReached.Add c_ThresholdReached

printfn "press 'a' key to increase total"
while Console.ReadKey(true).KeyChar = 'a' do
    printfn "adding one"
    c.Add 1
Module Module1

    Sub Main()
        Dim c As Counter = New Counter(New Random().Next(10))
        AddHandler c.ThresholdReached, AddressOf c_ThresholdReached

        Console.WriteLine("press 'a' key to increase total")
        While Console.ReadKey(True).KeyChar = "a"
            Console.WriteLine("adding one")
            c.Add(1)
        End While
    End Sub

    Sub c_ThresholdReached(sender As Object, e As ThresholdReachedEventArgs)
        Console.WriteLine("The threshold of {0} was reached at {1}.", e.Threshold, e.TimeReached)
        Environment.Exit(0)
    End Sub
End Module

Class Counter
    Private threshold As Integer
    Private total As Integer

    Public Sub New(passedThreshold As Integer)
        threshold = passedThreshold
    End Sub

    Public Sub Add(x As Integer)
        total = total + x
        If (total >= threshold) Then
            Dim args As ThresholdReachedEventArgs = New ThresholdReachedEventArgs()
            args.Threshold = threshold
            args.TimeReached = DateTime.Now
            OnThresholdReached(args)
        End If
    End Sub

    Protected Overridable Sub OnThresholdReached(e As ThresholdReachedEventArgs)
        RaiseEvent ThresholdReached(Me, e)
    End Sub

    Public Event ThresholdReached As EventHandler(Of ThresholdReachedEventArgs)
End Class

Class ThresholdReachedEventArgs
    Inherits EventArgs

    Public Property Threshold As Integer
    Public Property TimeReached As DateTime
End Class

Megjegyzések

A .NET eseménymodellje egy esemény delegáltján alapul, amely összekapcsol egy eseményt a kezelőjével. Az esemény létrehozásához két elemre van szükség:

  • Egy olyan meghatalmazott, amely egy olyan metódusra hivatkozik, amely választ ad az eseményre.
  • Ha az esemény adatokat szolgáltat, egy olyan osztály is, amely az esemény adatait tartalmazza.

A meghatalmazott egy olyan típus, amely meghatározza az aláírást, vagyis a metódus visszatérési értéktípusát és paraméterlista-típusait. A delegálás típusával deklarálhat egy változót, amely bármely olyan metódusra hivatkozhat, amely ugyanazzal az aláírással rendelkezik, mint a meghatalmazott.

Az eseménykezelő delegáltjának szabványos aláírása olyan metódust határoz meg, amely nem ad vissza értéket. Ennek a metódusnak az első paramétere típus, Object és az eseményt okozó példányra hivatkozik. A második paraméter a típusból EventArgs származik, és az eseményadatokat tárolja. Ha az esemény nem hoz létre eseményadatokat, a második paraméter egyszerűen a EventArgs.Empty mező értéke. Ellenkező esetben a második paraméter egy olyan típus, amely az eseményadatok tárolásához szükséges mezőket EventArgs vagy tulajdonságokat adja meg.

A EventHandler<TEventArgs> delegált egy előre definiált meghatalmazott, amely egy eseménykezelő metódust jelöl az adatokat létrehozó eseményhez. A használat EventHandler<TEventArgs> előnye, hogy nem kell saját egyéni meghatalmazottat kódolnia, ha az esemény eseményadatokat hoz létre. Egyszerűen adja meg az eseményadat-objektum típusát általános paraméterként.

Ha az eseményt az eseményt kezelő metódushoz szeretné társítani, adja hozzá a meghatalmazott egy példányát az eseményhez. Az eseménykezelőt mindig meghívja a rendszer, ha nem távolítja el a meghatalmazottat.

Az eseménykezelő delegáltjaival kapcsolatos további információkért lásd: Események kezelése és emelése.

Bővítő metódusok

Name Description
GetMethodInfo(Delegate)

Lekéri a megadott meghatalmazott által képviselt metódust képviselő objektumot.

A következőre érvényes:

Lásd még