2013-05-12 17 views
5

Ich habe keine Ahnung, wofür diese sind. Die documentation ist nicht ganz klar:Was sind GetField, SetField, GetProperty und SetProperty in der Enumeration von BindingFlags?

GetField Gibt an, dass der Wert des angegebenen Feldes zurückgegeben werden soll.

SetField Gibt an, dass der Wert des angegebenen Felds festgelegt werden soll.

GetProperty Gibt an, dass der Wert der angegebenen Eigenschaft zurückgegeben werden soll.

SetProperty Gibt an, dass der Wert der angegebenen Eigenschaft festgelegt werden soll. Bei COM-Eigenschaften entspricht das Angeben dieses Bindungsflags dem Angeben von PutDispProperty und PutRefDispProperty.

Wenn ich sie in BindingFlags Enumeration angeben, was sollten sie zurückgeben? Ich dachte, es hat mit Eigenschaften und Feldern eines Typs zu tun, aber dieser einfache Test sagt nein:

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 

Der gleiche Satz für SetField, GetProperty und SetProperty zurückgegeben.

Antwort

6

Alle diese werden nicht benötigt, um aufzuzählen, sondern um Eigenschaften richtig zu erreichen. Um beispielsweise einen Wert der Eigenschaft für eine bestimmte Instanz festzulegen, benötigen Sie das Flag SetProperty.

Base b; 

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

aber den Wert dieser Eigenschaft zu erhalten, können Sie die GetProperty verwenden müssten: Flagge.

Base b; 

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

Oh ich sehe; verwirrend, um den gleichen Satz von Flags in GetMembers zu sehen .. – nawfal

+0

Zustimmen, könnte etwas verwirrend sein. –