Usar instâncias de manipulador do evento genérico
TypeName |
UseGenericEventHandlerInstances |
CheckId |
CA1003 |
Category (Categoria) |
Microsoft.Design |
Quebrando alterar |
Quebrando |
Causa
Um tipo contém um delegado que retorna void, cuja assinatura contém dois parâmetros (o primeiro um objeto e o segundo um tipo que pode ser atribuído a EventArgs) e o de destinos assembly contendo .NET Framework 2,0.
Descrição da regra
Antes de .NET Framework 2,0, para passar informações personalizadas para o evento manipulador, um novo delegado tinha que ser declarado que especificou uma classe derivada da System.EventArgs classe. Isso não ocorre mais no .NET Framework 2,0, que introduziu a System.EventHandler<TEventArgs> delegado. Esse delegado genérico permite que qualquer classe derivada de EventArgs para ser usado com o manipulador de eventos.
Como corrigir violações
Para corrigir uma violação dessa regra, remova o delegado e substituir seu uso com o System.EventHandler<TEventArgs> Delegar. Se o delegado é gerado automaticamente pelo compilador do Visual Basic, alterar a sintaxe da declaração de evento para usar o System.EventHandler<TEventArgs> Delegar.
Quando suprimir avisos
Não suprimir um aviso da regra.
Exemplo
O exemplo a seguir mostra um delegado que viola a regra.No exemplo do Visual Basic, comentários descrevem como modificar o exemplo para satisfazer a regra.Por exemplo translation from VPE for Csharp, segue um exemplo que mostra o código modificado.
Imports System
Namespace DesignLibrary
Public Class CustomEventArgs
Inherits EventArgs
Public info As String = "data"
End Class
Public Class ClassThatRaisesEvent
' This statement creates a new delegate, which violates the rule.
Event SomeEvent(sender As Object, e As CustomEventArgs)
' To satisfy the rule, comment out the previous line
' and uncomment the following line.
'Event SomeEvent As EventHandler(Of CustomEventArgs)
Protected Overridable Sub OnSomeEvent(e As CustomEventArgs)
RaiseEvent SomeEvent(Me, e)
End Sub
Sub SimulateEvent()
OnSomeEvent(New CustomEventArgs())
End Sub
End Class
Public Class ClassThatHandlesEvent
Sub New(eventRaiser As ClassThatRaisesEvent)
AddHandler eventRaiser.SomeEvent, AddressOf HandleEvent
End Sub
Private Sub HandleEvent(sender As Object, e As CustomEventArgs)
Console.WriteLine("Event handled: {0}", e.info)
End Sub
End Class
Class Test
Shared Sub Main()
Dim eventRaiser As New ClassThatRaisesEvent()
Dim eventHandler As New ClassThatHandlesEvent(eventRaiser)
eventRaiser.SimulateEvent()
End Sub
End Class
End Namespace
using System;
namespace DesignLibrary
{
// This delegate violates the rule.
public delegate void CustomEventHandler(
object sender, CustomEventArgs e);
public class CustomEventArgs : EventArgs
{
public string info = "data";
}
public class ClassThatRaisesEvent
{
public event CustomEventHandler SomeEvent;
protected virtual void OnSomeEvent(CustomEventArgs e)
{
if(SomeEvent != null)
{
SomeEvent(this, e);
}
}
public void SimulateEvent()
{
OnSomeEvent(new CustomEventArgs());
}
}
public class ClassThatHandlesEvent
{
public ClassThatHandlesEvent(ClassThatRaisesEvent eventRaiser)
{
eventRaiser.SomeEvent +=
new CustomEventHandler(HandleEvent);
}
private void HandleEvent(object sender, CustomEventArgs e)
{
Console.WriteLine("Event handled: {0}", e.info);
}
}
class Test
{
static void Main()
{
ClassThatRaisesEvent eventRaiser = new ClassThatRaisesEvent();
ClassThatHandlesEvent eventHandler =
new ClassThatHandlesEvent(eventRaiser);
eventRaiser.SimulateEvent();
}
}
}
O exemplo a seguir remove a declaração do delegado do exemplo anterior, que satisfaz a regra e substitui sua utilização no ClassThatRaisesEvent e ClassThatHandlesEvent métodos com o System.EventHandler<TEventArgs> Delegar.
using System;
namespace DesignLibrary
{
public class CustomEventArgs : EventArgs
{
public string info = "data";
}
public class ClassThatRaisesEvent
{
public event EventHandler<CustomEventArgs> SomeEvent;
protected virtual void OnSomeEvent(CustomEventArgs e)
{
if(SomeEvent != null)
{
SomeEvent(this, e);
}
}
public void SimulateEvent()
{
OnSomeEvent(new CustomEventArgs());
}
}
public class ClassThatHandlesEvent
{
public ClassThatHandlesEvent(ClassThatRaisesEvent eventRaiser)
{
eventRaiser.SomeEvent +=
new EventHandler<CustomEventArgs>(HandleEvent);
}
private void HandleEvent(object sender, CustomEventArgs e)
{
Console.WriteLine("Event handled: {0}", e.info);
}
}
class Test
{
static void Main()
{
ClassThatRaisesEvent eventRaiser = new ClassThatRaisesEvent();
ClassThatHandlesEvent eventHandler =
new ClassThatHandlesEvent(eventRaiser);
eventRaiser.SimulateEvent();
}
}
}
Regras relacionadas
Evitar o excesso parâmetros em tipos genéricos
Coleções devem implementar a interface genérica
Não declarará membros estático tipos genéricos
Não se aninham tipos genéricos em assinaturas de membro
Métodos genéricos devem fornecer o parâmetro de tipo
Use genéricos onde for apropriado