2012-02-09 42 views
20

Tôi đã viết một serializer tùy chỉnh hoạt động bằng cách thiết lập các thuộc tính đối tượng bằng cách phản chiếu. Các lớp serializable được gắn thẻ với thuộc tính serializable và tất cả các thuộc tính serializable cũng được gắn thẻ. Ví dụ, lớp sau là serializable:Có thể nhận được thiết lập riêng tư của tài sản thông qua phản ánh không?

[Serializable] 
public class Foo 
{ 
    [SerializableProperty] 
    public string SomethingSerializable {get; set;} 

    public string SometthingNotSerializable {get; set;} 
} 

Khi serializer được yêu cầu deserialize SomethingSerializable, nó được các phương pháp tập hợp các tài sản và sử dụng nó để cài đặt nó bằng cách làm một cái gì đó như thế này:

PropertyInfo propertyInfo; //the property info of the property to set 
//...// 
if (propertyInfo.CanWrite && propertyInfo.GetSetMethod() != null) 
{ 
    propertyInfo.GetSetMethod().Invoke(obj, new object[]{val}); 
} 

Điều này làm việc tốt, tuy nhiên, làm thế nào tôi có thể làm cho các thiết lập tài sản có thể truy cập chỉ để serializer? Nếu setter là riêng tư:

public string SomethingSerializable {get; private set;} 

thì cuộc gọi đến propertyInfo.GetSetMethod() trả về null trong bộ nối tiếp. Có cách nào để truy cập vào setter tư nhân hoặc bất kỳ cách nào khác để đảm bảo rằng chỉ serializer có thể truy cập setter? Bộ nối tiếp không được đảm bảo ở trong cùng một assembly.

Trả lời

30

Như bạn đã tìm ra, có một cách để truy cập vào một setter ngoài công lập như sau:

PropertyInfo property = typeof(Type).GetProperty("Property"); 
property.GetSetMethod(true).Invoke(obj, new object[] { value }); 

Có một cách khác, tuy nhiên, nếu tôi nhớ chính xác:

PropertyInfo property = typeof(Type).GetProperty("Property"); 
property.SetValue(obj, value, BindingFlags.NonPublic | BindingFlags.Instance, null, null, null); 
+2

Đầu tiên làm việc cho tôi một cách độc đáo! – Roboblob

+2

Cái đầu tiên hoạt động, cái thứ hai không – gibarsin

+1

Cái đầu tiên hoạt động; trong lần thứ hai trên "thuộc tính" trả về giá trị null. –

Các vấn đề liên quan