Ok, I\'m probably just having an epic fail here, but my mind wants to say this should work.
Assume DataProtect.DecryptData takes an encrypted string as input and a d
You can not assign anything to "this". Change ArriveDetails to a static that return the deserialised object.
class ArrivedDetails
{
static ArrivedDetails Create(string encrypted)
{ return DataProtect.deserializeXML(...) }
}
No, this is not possible using a constructor, you can't reassign this
.
Use a static method instead:
public static ArrivedDetails CreateFromString(string encrypted)
{
return DataProtect.deserializeXML(DataProtect.DecryptData(encrypted));
}
Call it:
ArrivedDetails details = ArrivedDetails.CreateFromString(encrypted);
What you want is a static factory method that creates the object you require.
class ArrivedDetails
{
///...
public static ArrivedDetails CreateFromEncryptedKey(string encrypted)
{
return DataProtect.deserializeXML(DataProtect.DecryptData(encrypted));
}
///...
The reason your initial approach didn't work is because this
is a private read-only instance field that returns the object from which it is called. You can't write to this
.
You can archive this with reflection as follows.
var tmp = 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);
This assigns the deserialized object to a temporal variable, and copy the value in each public property to this
with reflection. This snippet avoids to copy properties with the XmlIgnore attribute.