2011-03-22 24 views
8

Ok, tôi có lẽ chỉ có một thất bại hoành tráng ở đây, nhưng tâm trí của tôi muốn nói điều này sẽ làm việc.Deserialize to self

Giả sử DataProtect.DecryptData nhận chuỗi được mã hóa làm đầu vào và chuỗi được giải mã là đầu ra. Giả sử deserializeXML tạo ra đối tượng thích hợp và trả về nó từ chuỗi mới được giải mã.

So. Tại sao nó không hoạt động?

class ArrivedDetails 
{ 
///... 

    internal ArrivedDetails(string encrypted) 
    { 
     this = DataProtect.deserializeXML(DataProtect.DecryptData(encrypted)); 
    } 
///... 

Cung cấp cho tôi một lỗi của

Cannot assign to '<this>' because it's read only 

Cụ thể hơn ,, làm thế nào tôi có thể làm việc này? Tôi về cơ bản muốn giải mã một phiên bản XML được tuần tự hóa của đối tượng và sau đó deserialize nó trong constructor.

Tôi mở cửa cho "bạn không thể" (với lời giải thích) vì tôi có thể đặt nó ở nơi khác và chỉ định giá trị, nhưng tâm trí của tôi nói điều gì đó như thế này là có thể.

Trả lời

12

Không, điều này là không thể bằng cách sử dụng một hàm tạo, bạn không thể gán lại this.

Sử dụng một phương pháp tĩnh thay vì:

public static ArrivedDetails CreateFromString(string encrypted) 
{ 
    return DataProtect.deserializeXML(DataProtect.DecryptData(encrypted)); 
} 

Gọi nó:

ArrivedDetails details = ArrivedDetails.CreateFromString(encrypted); 
+0

Mặc dù tôi đồng ý với dotalchemy rằng khái niệm ban đầu sẽ hoạt động, một phương pháp tĩnh sẽ thực hiện thủ thuật. Tôi thích rằng bạn không instantiating một đối tượng mới và chỉ trả lại nó. – Farhan

2

Những gì bạn muốn là một phương thức tĩnh mà tạo ra các đối tượng bạn yêu cầu.

class ArrivedDetails 
{ 
///... 

    public static ArrivedDetails CreateFromEncryptedKey(string encrypted) 
    { 
     return DataProtect.deserializeXML(DataProtect.DecryptData(encrypted)); 
    } 
///... 

Lý do cách tiếp cận ban đầu của bạn không làm việc là vì this là một chỉ đọc instance field tin rằng trả về đối tượng mà từ đó nó được gọi. Bạn không thể viết thư cho this.

3

Bạn không thể gán bất cứ điều gì cho "điều này". Thay đổi ArriveDetails thành tĩnh trả về đối tượng deserialised.

class ArrivedDetails 
{ 
    static ArrivedDetails Create(string encrypted) 
    { return DataProtect.deserializeXML(...) } 
} 
3

Bạn có thể lưu trữ điều này với sự phản ánh như sau.

A config = DataProtect.deserializeXML(DataProtect.DecryptData(encrypted)); 
foreach (var property in GetType().GetProperties()) 
    if (property.GetCustomAttributes(typeof (XmlIgnoreAttribute), false).GetLength(0) == 0) 
     property.SetValue(this, property.GetValue(tmp, null), null); 

này gán đối tượng deserialized cho một biến theo thời gian, và sao chép các giá trị trong mỗi tài sản công cộng để this với sự phản ánh. Đoạn mã này tránh để sao chép các thuộc tính với thuộc tính XmlIgnore.