2010-11-22 4 views
-1

Je souhaite créer une sous-classe EventArgs générique qui possède une propriété en écriture seule qui, mise à jour par le code qui gère l'événement, mettra également à jour le paramètre byref du constructeur de la classe.Accès au paramètre constructeur ByRef

Le code que j'ai jusqu'ici ne fonctionne pas. Comment obtenir la propriété "Item" pour mettre à jour le paramètre constructeur "item" afin que je puisse récupérer la valeur qui a été définie?

public class EventArgsSet<T> : EventArgs 
{ 
    public EventArgsSet(ref T item) 
    { 
     Item = item; 
    } 

    public T Item 
    { 
     private get; 
     set; 
    } 
} 

Je veux être en mesure de déclencher l'événement comme celui-ci (VB.NET):

Dim myItem As SomeType = Nothing 
Dim e = new EventArgsSet(Of SomeType)(myItem) 
RaiseEvent SomeEvent(Me, e) 
//'Do something with myItem 

Et le gestionnaire d'événements pourrait ressembler à ceci:

Public Sub myObj_SomeEvent(sender As Object, e As EventArgsSet(Of SomeType)) Handles myObj.SomeEvent 
    e.Item = theObjectToSet 
End Sub 

Répondre

2

Pourquoi faire cela via des événements? Je pense qu'un événement est le mauvais idiome pour ce que vous essayez de faire. Au lieu de cela, j'exposer une méthode de rappel comme une propriété, quelque chose comme ceci:

Public Property GetMyItem As Func(Of SomeType) = Function() Return Nothing 

Ensuite, vous pouvez tout simplement faire quelque chose comme (ma syntaxe VB.Net est un peu rouillé à ce sujet):

Dim myItem = GetMyItem()() 

et au lieu d'enregistrer un événement, vous définissez simplement la méthode de rappel comme ceci:

myObj.GetMyItem() = Function() return theObjectToSet 
1

Pourquoi wouldn 't la classe avec le gestionnaire d'événements a un champ pour cette valeur que vous voulez mettre à jour? Il me semble que vous faites trop la classe EventArgs.

En outre, la façon dont vous avez cela ne fonctionne pas comme vous le souhaitez. (mais je suppose que vous voyez que ce n'est pas vous posez la question). Cela ne fonctionne pas car lorsque vous définissez la propriété Item, vous modifiez ce que la classe EventArgs pointe vers.

+0

Parce que l'événement est tiré d'un objet enfant qui demande d'information de l'objet parent, mais ne devrait pas être nécessaire d'avoir tout k connaissance de la structure des parents. Pour la deuxième partie de votre réponse, oui, je suis au courant de la faille dans le code que j'ai posté, mais je pensais que cela aiderait à montrer ce que j'essayais d'accomplir. Je suppose que j'avais tort à ce sujet. – adam0101

+0

Si vous avez exposé le getter, vous pouvez simplement mettre à jour l'élément directement. ce ne serait pas une simple assignation, il faudrait plutôt que vous sachiez ce que vous devez mettre à jour sur l'objet. Peut-être que vous pourriez utiliser une interface pour permettre à la classe de savoir comment "se mettre à jour" elle-même. – Bryan

Questions connexes