Compartir a través de


CA1003: Utilizar instancias genéricas de controlador de eventos

TypeName

UseGenericEventHandlerInstances

Identificador de comprobación

CA1003

Categoría

Microsoft.Design

Cambio problemático

Problemático

Motivo

Un tipo contiene un delegado que devuelve void cuya firma contiene dos parámetros (el primero un objeto y el segundo un tipo asignable a EventArgs), y el ensamblado que lo contiene está dirigido a .NET Framework 2,0.

Descripción de la regla

Antes de .NET Framework 2,0, para poder pasar información personalizada al controlador de eventos, era necesario declarar un nuevo delegado que especificaba una clase que derivaba de la clase EventArgs.Esto ya no es necesario en .NET Framework 2,0, con la introducción del delegado EventHandler.Este delegado genérico permite que cualquier clase derivada de EventArgs se utilice junto con el controlador de eventos.

Cómo corregir infracciones

Para corregir una infracción de esta regla, quite el delegado y reemplace su uso utilizando el delegado EventHandler.Si el compilador de Visual Basic genera automáticamente el delegado, cambie la sintaxis de la declaración de evento para utilizar el delegado de EventHandler.

Cuándo suprimir advertencias

No suprima las advertencias de esta regla.

Ejemplo

El siguiente ejemplo muestra un delegado que infringe la regla.En el ejemplo de Visual Basic, los comentarios describen cómo modificar el ejemplo de modo que se cumpla la regla.En cuanto al ejemplo de C#, a continuación figura un ejemplo que muestra el 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();
      }
   }
}

El ejemplo siguiente quita la declaración de delegado del ejemplo anterior, que cumple la regla, y reemplaza su uso en los métodos ClassThatRaisesEvent y ClassThatHandlesEvent mediante el delegado EventHandler.

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();
      }
   }
}

Reglas relacionadas

CA1005: Evite parámetros excesivos en tipos genéricos

CA1010: Las colecciones deben implementar la interfaz genérica

CA1000: No declarar miembros estáticos en tipos genéricos

CA1002: No exponer listas genéricas

CA1006: No anidar tipos genéricos en firmas de miembro

CA1004: Los métodos genéricos deben proporcionar un parámetro de tipo

CA1007: Utilizar valores genéricos cuando sea posible

Vea también

Referencia

Genéricos (Guía de programación de C#)