アクセシビリティに基づいてプロパティの WPF バインディングを生成するクラスを作成しています。主な方法は次のとおりです。
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
}
DisplayNamea のプロパティはと のListViewModel両方CanReadであることがわかりましたCanWrite。ただし、 を呼び出すとprop.GetAccessors()、get_DisplayName()アクセサーのみがリストされます。
ここで何が起こっているのですか?プロパティの保護レベルではない場合、何CanReadを示し、何を示していますか? CanWrite私のメソッドの正しい実装は何ですか?