2012-05-05 2 views
2

私は、アクセシビリティに基づいてプロパティのWPFバインディングを生成するクラスを作成しています。重要な方法は次のとおりです。CanReadとCanWriteはPropertyInfoの意味は何ですか?

static Binding getBinding(PropertyInfo prop) 
{ 
    var bn = new Binding(prop.Name); 
    bn.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
    if (prop.CanRead && prop.CanWrite) 
     bn.Mode = BindingMode.TwoWay; 
    else if (prop.CanRead) 
     bn.Mode = BindingMode.OneWay; 
    else if (prop.CanWrite) 
     bn.Mode = BindingMode.OneWayToSource; 
    return bn; 
} 

ただし、これは期待どおりではありません。 CanWritetrueです。たとえば、このプロパティに:

abstract class AbstractViewModel { 
    public virtual string DisplayName { get; protected set; } 
} 

class ListViewModel : AbstractViewModel { 
    //does not override DisplayName 
} 

私はListViewModelDisplayNameプロパティがCanReadCanWriteの両方であることがわかります。ただし、prop.GetAccessors()と呼び出すと、get_DisplayName()アクセサのみが表示されます。

ここでは何が起こっていますか? CanReadCanWriteは、そのプロパティの保護レベルではない場合はどうなりますか?私のメソッドの正しい実装は何でしょうか?

+0

さて、AbstractViewModelは抽象的ではないという事実から始めましょう...私は、間違った実装(派生した実装がない仮想)からの決定論的な振る舞いを期待できないと思います。 –

+0

本当の質問は、アクセス可能なgetterとsetterを確認するにはどうすればいいですか?もしそうなら、Jon Skeetは次のように答えます:http://stackoverflow.com/a/302492/44372 –

+0

@JaimieOlivares仮想メソッドとプロパティはオーバーライドする必要はありません。必要に応じて、それらを上書きすることができます。あなたは正しいですが、 'AbstractViewModel'は実際に私のアプリケーションで抽象として宣言されています...私は質問を編集します。 – Oliver

答えて

11

CanReadとCanWriteは何を表していますか?

質問がある場合は、最初にドキュメントを参照する必要があります。

CanRead

プロパティはgetアクセサを持っていない場合は、それを読み取ることができません。

CanWrite

プロパティはsetアクセサを持っていない場合、それはに書き込むことはできません。

ので、プロパティは、その保護レベルが何であるか、getsetアクセサがあるかどうかではない示しています。これの1つの理由は、Reflectionがどこから呼び出しているのかわからないため、実際にアクセサにアクセスできるかどうかはわかりません。

アクセサーにアクセスできるかどうかを確認するには、GetGetMethod()GetSetMethod()を呼び出します。プロパティにpublic get/setアクセサがない場合は、nullが返されます。

+0

ありがとうございます。 Reflectionはどこから呼び出されているのかわからないが、呼び出し元からどのアクセサが見えているかを調べることができるので、このCanReadとCanWriteの定義はちょっと変わったと思う。ご回答有難うございます。 – Oliver

+0

@Oliver - 実際はありません。すべての 'CanWrite'は、セッターが存在すると言っています。 – ChrisF

+0

@Oliver、 'GetAccessors()'があなたのためにアクセス可能なアクセサしか返さないということを意味するならば、それは当てはまりません。繰り返しになりますが、ドキュメントを読んでください。さらに多くのものにアクセスできたとしても、常にパブリックアクセサリーだけが返されることがわかります。 – svick

関連する問題