2016-04-19 44 views
2

現在のバージョンのMVVM Lightには、という名前のヘルパー関数Setがあります。継承ViewModelクラスは、1回の呼び出しでプロパティ値の変更と変更通知の呼び出しを呼び出します。新しいNameOf演算子と一緒にすると、これによりプロパティのボイラープレートコードがはるかに小さくなります。VB.NETはオーバーロードされた関数を区別できません

問題はしかしSet機能が過負荷と3つの過負荷の外に、以下の2つのオーバーロードはVB.NETを怒られていることである。

Protected Function [Set](Of T)(propertyName As String, ByRef field As T, newValue As T) As Boolean 
Protected Function [Set](Of T)(ByRef field As T, newValue As T, <CallerMemberName> Optional propertyName As String = Nothing) As Boolean 

あなたはString typeプロパティを持っている場合は、VB.NET私たちが呼んでいる過負荷を区別することはできません。

'[設定]' はアクセスがこれらの引数のための最も具体的ではありませんので、オーバーロードの解決に失敗しました:

「保護されたオーバーロード関数(列の)[設定](文字列propertyNameの、ByRefのフィールドのString、newValueにとして、文字列として)As Boolean ':最も具体的なものではありません。

'Protectedオーバーロード機能[設定](Of String)(ByRefフィールドはString、newValueはString、[propertyName As String = Nothing])はブール値です。

refキーワードを使用すると、C#でこの状況を簡単に処理できることに注意してください。また、現在の状況はMVVM Lightに関連していますが、問題自体は一般的です。名前付きのパラメータも使用しようとしましたが、どちらも役に立ちません。これがどのように解決できるかについてのヒントは?

+0

回避策は、独自の構造体を作成して、演算子をプライベート 'String'フィールドと照合するようにオーバーライドすることです。 –

答えて

1

ここでもまたほぼ一年後です。私はちょうどほとんどの場合に動作する少しの回避策を見つけました。

Protected Function [Set](Of T)(ByRef field As T, newValue As T, <CallerMemberName> Optional propertyName As String = Nothing) As Boolean 

この過負荷の三番目のパラメータはオプションで、コールでそれをスキップする場合は、それはそれに値を代入するCallerMemberNameを使用します。代わりに質問に記載されたオーバーロードのいずれかを呼び出すことで、3番目のオーバーロードを使用します。 Setはほとんどの場合、プロパティ内から呼び出されるため、この方法はうまくいくはずです。他のオーバーロードは2つのパラメータをとらないので、コンパイラはそれを正しく解決できます。

関連する問題