2016-03-09 6 views
16

私はいくつかのページを持ち、それぞれがDataというプロパティを持っています。別のページでは、私はこのように、このデータを設定しています:割り当ての左側にヌル条件付き演算子を使用する

if (MyPage1 != null) 
    MyPage1.Data = this.data; 
if (MyPage2 != null) 
    MyPage2.Data = this.data; 
if (MyPage3 != null) 
    MyPage3.Data = this.data; 

MyPage上のヌル条件演算子を使用するすべての可能性はありますか?私はこのような何かを考えています:

MyPage?.Data = this.data; 

しかし、私はこのようにそれを書くとき、私は次のエラーを取得:

The left-hand side of an assignment must be a variable, property or indexer.

を私はMyPageがnullになる可能性があるため、それは知っていると左手側はもはや変数ではありません。

それは、私はすでにそれを持っているように、私はそれを使用することができないということではないのですが、私はちょうどこの上のヌル条件演算子を使用するすべての可能性があるかどうかを知りたいです。

+7

あなたは 'SetData'メソッドを作成し、' MYPAGE1 .SetData(this.data)を行うことができるはず。?[なぜC#6の ' –

+1

可能性の重複。0はNull伝播演算子を使用するときnull以外のヌル可能な構造体のプロパティを設定させませんか?](http://stackoverflow.com/questions/31035022/why-c-sharp-6-0-doesnt-let-to -set-of-non-null-nullable-struct-when) –

+0

Null伝播/条件演算​​子はプロパティにアクセスするためのものであり、プロパティを設定するものではありません。したがって、あなたはそれを使用することはできません。 –

答えて

6

null伝播演算子は値を返します。あなたは代入の左側に変数を持たなければならず、値ではないので、このように使用することはできません。

確かに、あなたはtenary演算子を使用して、物事を短くすることができ、それは、他の一方で、実際に読みやすさの側面を助けていません。

あなたの質問に対するJoachim Isakssonのコメントは、うまくいくはずの別のアプローチを示しています。

1

お試しください すべてのページをmyPageListに追加してください。

IEnumerable<MyPage> myPageList; 

foreach(MyPage myPage in myPageList) 
{ 
if (myPage != null) 
    myPage.Data = this.data; 
} 
4

ヨアヒムIsakssonがコメントで示唆したように、私は今の方法SetData(Data data)を持っており、このようにそれを使用します。

MyPage1?.SetData(this.data); 
MyPage2?.SetData(this.data); 
MyPage3?.SetData(this.data); 
1

一般的な値の代入の拡張メソッド(だけのrefプロパティ)は次のようになります。

public static void SetValue<T>(this T property, T value) 
    { 
     property = value; 
    } 

そして

ButtonOrNull?.Visibility.SetValue(Visibility.Hidden); 
のように使用されます
+1

これはテストしましたか?これがうまくいかない方法はありません...あなたがやっている唯一のことは、関数内でプロパティのローカルコピーを設定しているため、 'T property'は変更のためのrefパラメータでなければなりません。 'this ref'拡張メソッドを持たず、C#ではプロパティへのrefアクセスを許可していません(実際には実際の恥であるVBとは異なります)。 –

+0

ああ、あなたは大丈夫です - それはrefパラメータだけで動作します(私の場合は、いつもうまくいきました) – copa017

0

私は次の拡張、グローバルと呼ばれることも

public static class ObjectExtensions 
{ 
    public static void SetValue<TValue>(this object @object, string propertyName, TValue value) 
    { 
     var property = @object.GetType().GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance); 
     if (property?.CanWrite == true) 
      property.SetValue(@object, value, null); 
    } 
} 

を思い付きました。これは公開されたプロパティでのみ機能します。

myObject?.SetValue("MyProperty", new SomeObject()); 

次改良版では、何に取り組んでいます

public static void SetValue<TObject>(this TObject @object, Action<TObject> assignment) 
{ 
    assignment(@object); 
} 

も世界的に呼び出すことができ、

myObject?.SetValue(i => i.MyProperty = new SomeObject()); 

しかしActionが独占的に必要としないので、拡張子名は、やや誤解を招きます仕事、宿題。

関連する問題