私は、アクセシビリティに基づいてプロパティの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;
}
ただし、これは期待どおりではありません。 CanWrite
はtrue
です。たとえば、このプロパティに:
abstract class AbstractViewModel {
public virtual string DisplayName { get; protected set; }
}
class ListViewModel : AbstractViewModel {
//does not override DisplayName
}
私はListViewModel
のDisplayName
プロパティがCanRead
とCanWrite
の両方であることがわかります。ただし、prop.GetAccessors()
と呼び出すと、get_DisplayName()
アクセサのみが表示されます。
ここでは何が起こっていますか? CanRead
とCanWrite
は、そのプロパティの保護レベルではない場合はどうなりますか?私のメソッドの正しい実装は何でしょうか?
さて、AbstractViewModelは抽象的ではないという事実から始めましょう...私は、間違った実装(派生した実装がない仮想)からの決定論的な振る舞いを期待できないと思います。 –
本当の質問は、アクセス可能なgetterとsetterを確認するにはどうすればいいですか?もしそうなら、Jon Skeetは次のように答えます:http://stackoverflow.com/a/302492/44372 –
@JaimieOlivares仮想メソッドとプロパティはオーバーライドする必要はありません。必要に応じて、それらを上書きすることができます。あなたは正しいですが、 'AbstractViewModel'は実際に私のアプリケーションで抽象として宣言されています...私は質問を編集します。 – Oliver