2010-11-22 8 views
-1

イベントを処理しているコードによって更新されたときに、クラスのコンストラクタのbyrefパラメータも更新される書き込み専用プロパティを持つ汎用EventArgsサブクラスを作成します。コンストラクタパラメータへのアクセスByRef

これまでのコードは動作しません。設定された値を取得できるように、「アイテム」コンストラクタパラメータを更新するプロパティ「アイテム」を取得するにはどうすればよいですか?

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

そして、このようなものになりますイベントハンドラ:

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

答えて

2

なぜイベントでこれを行うのですか?私はイベントがあなたがしようとしているものの間違ったイディオムだと思う。代わりに、私は、プロパティとして、このようなもののコールバックメソッドを公開します:

Dim myItem = GetMyItem()() 

:あなたは、単にような何かを行うことができます次に

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

を(私のVB.Netの構文は、この上のさびビットがあります)イベントは、親オブジェクトからの情報を要求している子オブジェクトから発射されているが、持つことが要求されるべきではないので

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

なぜwouldnを

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

    public T Item 
    { 
     private get; 
     set; 
    } 
} 

は、私はこのようなイベント(VB.NET)を上げることができるようにしたいですイベントハンドラを持つクラスには、この値を更新するフィールドがありますか? EventArgsクラスをあまりにも多くしすぎているように思えます。

また、あなたが持っている方法は、あなたが望むように動作しません。 (しかし、私はあなたがあなたが質問をしているのではないと思います)。 Itemプロパティを設定すると、EventArgsクラスが指しているものが変更されるため、これは機能しません。

+0

:代わりにイベントを登録すると、あなたは、単にそのようなコールバックメソッドを設定します任意のk親の構造の養子縁組。答えの2番目の部分については、私が投稿したコードの脆弱性を認識していますが、達成しようとしていることを示すのに役立つと思いました。私はそれについて間違っていたと思う。 – adam0101

+0

ゲッターを公開した場合、アイテムを直接更新することができます。それは単純な割り当てではないでしょう、それはあなたがオブジェクト上で更新する必要があるかを知る必要があるでしょう。たぶんクラスを "更新"する方法を知るためのインターフェイスを使うことができます。 – Bryan

関連する問題