2013-05-12 4 views
5

Я понятия не имею, для чего они предназначены. documentation не очень понятно:Что такое GetField, SetField, GetProperty и SetProperty в перечислении BindingFlags?

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 

Тот же набор возвращается для SetField, GetProperty и SetProperty.

ответ

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

Согласитесь, может быть, это путаница. –