4

アクセシビリティに基づいてプロパティの 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私のメソッドの正しい実装は何ですか?

4

1 に答える 1

17

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

そのような質問がある場合は、まずドキュメントを参照してください。

CanRead:

プロパティにgetアクセサーがない場合は、読み取ることができません。

CanWrite:

プロパティにsetアクセサーがない場合は、書き込みできません。

したがって、プロパティは、保護レベルではなく、getandsetアクセサーがあるかどうかを示します。この理由の 1 つは、リフレクションがどこから呼び出しているかがわからないため、実際にアクセサーにアクセスできるかどうかがわからないことです。

あなたができることは、アクセサにアクセスできるかどうかを調べることGetGetMethod()ですGetSetMethod(). getプロパティに public /setアクセサーがない場合、それらは を返しnullます。

于 2012-05-05T11:52:24.207 に答える