2013-05-12 11 views
5

Tôi không biết nó là cái gì. Các documentation không phải là rất rõ ràng:GetField, SetField, GetProperty và SetProperty trong liệt kê BindingFlags là gì?

GetField Chỉ định rằng giá trị của lĩnh vực quy định nên được trả lại.

SetField Chỉ định rằng giá trị của trường được chỉ định sẽ được đặt.

GetProperty Chỉ định rằng giá trị của thuộc tính được chỉ định phải được trả về.

SetProperty Chỉ định rằng giá trị của thuộc tính được chỉ định sẽ được đặt. Đối với các thuộc tính COM, chỉ định cờ ràng buộc này tương đương với việc chỉ định PutDispProperty và PutRefDispProperty.

Nếu tôi chỉ định chúng trong BindingFlags liệt kê, chúng nên trở lại điều gì? Tôi nghĩ rằng nó đã làm với các thuộc tính và các lĩnh vực của một loại, nhưng kiểm tra đơn giản này nói không:

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 

Tập cùng được trả về cho SetField, GetPropertySetProperty.

Trả lời

6

Tất cả những điều này không cần thiết để kê khai mà đúng hơn là truy cập các thuộc tính đúng cách. Ví dụ, để thiết lập một giá trị của thuộc tính trên cá thể đã cho, bạn cần cờ SetProperty.

Base b; 

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

nhưng để lấy giá trị của thuộc tính này, bạn sẽ cần sử dụng cờ GetProperty: .

Base b; 

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

Ồ tôi hiểu; khó hiểu khi thấy cùng một bộ cờ được sử dụng trong 'GetMembers' .. – nawfal

+0

Đồng ý, có thể gây nhầm lẫn. –