2013-05-12 4 views
5

Nie mam pojęcia, do czego one służą. documentation nie jest bardzo jasne:Co to są GetField, SetField, GetProperty i SetProperty w wyliczaniu BindingFlags?

GetField Określa, że ​​wartość danego pola powinny być zwrócone.

SetField Określa, że ​​należy ustawić wartość określonego pola.

GetProperty Określa, że ​​wartość określonej właściwości powinna zostać zwrócona.

SetProperty Określa, że ​​należy ustawić wartość określonej właściwości. W przypadku właściwości COM określenie tej flagi powiązania jest równoważne określeniu PutDispProperty i PutRefDispProperty.

Jeśli określę je w wyliczeniu BindingFlags, co powrócą? Myślałem, że ma do czynienia z właściwości i pól typu, ale ten prosty test nie mówi:

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 

Ten sam zestaw jest zwracana dla SetField, GetProperty i SetProperty.

Odpowiedz

6

Wszystkie te elementy nie są potrzebne do wyliczenia, ale raczej do prawidłowego dostępu do właściwości. Na przykład, aby ustawić wartość właściwości na danej instancji, potrzebujesz flagi SetProperty.

Base b; 

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

ale aby uzyskać wartość tej właściwości, trzeba by użyć GetProperty: flagę.

Base b; 

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

Och, widzę; mylące, aby zobaczyć ten sam zestaw flag używanych w 'GetMembers' .. – nawfal

+0

Zgadzam się, może być trochę mylące. –