2013-05-12 10 views
5

私はこれらが何であるか分かりません。 documentationは非常に明確ではありません。BindingFlags列挙体でGetField、SetField、GetProperty、およびSetPropertyとは何ですか?

GetFieldのは、指定したフィールドの値が返されるべきであることを指定します。

SetField指定したフィールドの値を設定することを指定します。

GetProperty指定されたプロパティの値を返すように指定します。

SetProperty指定されたプロパティの値を設定する必要があることを指定します。 COMプロパティの場合、このバインディングフラグを指定することは、PutDispPropertyとPutRefDispPropertyを指定することと同じです。

BindingFlags列挙型で指定した場合、返される内容は何ですか?私はそれがタイプのプロパティとフィールドに関係していると思っていないが、この単純なテストには言う:

class Base 
{ 
    int i; 
    int I { get; set; } 

    void Do() 
    { 

    } 
} 

print typeof(Base).GetMembers(BindingFlags.GetField 
           | BindingFlags.Instance 
           | BindingFlags.NonPublic); 

// Int32 get_I() 
// Void set_I(Int32) 
// Void Do() 
// Void Finalize() 
// System.Object MemberwiseClone() 
// Int32 I 
// Int32 i 
// Int32 <I>k__BackingField 

同じセットがSetFieldGetPropertySetPropertyに返されます。

答えて

6

これらはすべて列挙するのではなく、プロパティに正しくアクセスするために必要なものです。たとえば、指定されたインスタンスでプロパティの値を設定するには、SetPropertyフラグが必要です。

Base b; 

typeof(Base).InvokeMember("I", 
    BindingFlags.SetProperty|BindingFlags.Public|BindingFlags.Instance, 
    ..., 
    b, new object[] { newvalue }); 

が、このプロパティの値を取得するには、GetPropertyメソッドを使用する必要があります: フラグ。

Base b; 

int val = (int)typeof(Base).InvokeMember("I", 
    BindingFlags.GetProperty|BindingFlags.Public|BindingFlags.Instance, 
    ..., 
    b, null); 
+0

ありがとうございます。 'GetMembers'で使われているのと同じフラグセットを見るのが混乱します。 – nawfal

+0

同意すると、混乱するかもしれません。 –