好吧,我可能只是在这里遇到一个史诗般的失败,但我的想法是想说这应该有效。
假设DataProtect.DecryptData将加密字符串作为输入,将解密后的字符串作为输出。假设deserializeXML生成适当的对象并从新解密的字符串返回它。
因此。为什么这不起作用?
class ArrivedDetails
{
///...
internal ArrivedDetails(string encrypted)
{
this = DataProtect.deserializeXML(DataProtect.DecryptData(encrypted));
}
///...
给我一个错误
Cannot assign to '<this>' because it's read only
更具体地说,我怎样才能使这个工作?我本质上想要解密对象的XML序列化版本,然后在构造函数中反序列化它。
我愿意接受“你不能”(带有解释),因为我可以把它放在其他地方并且只是分配值,但是我的想法应该是这样的。
答案 0 :(得分:16)
不,使用构造函数是不可能的,您无法重新分配this
。
改为使用静态方法:
public static ArrivedDetails CreateFromString(string encrypted)
{
return DataProtect.deserializeXML(DataProtect.DecryptData(encrypted));
}
称之为:
ArrivedDetails details = ArrivedDetails.CreateFromString(encrypted);
答案 1 :(得分:3)
您无法为“this”分配任何内容。将ArriveDetails更改为返回反序列化对象的静态。
class ArrivedDetails
{
static ArrivedDetails Create(string encrypted)
{ return DataProtect.deserializeXML(...) }
}
答案 2 :(得分:3)
您可以使用反射对此进行归档,如下所示。
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);
这会将反序列化的对象分配给时态变量,并使用反射将每个公共属性中的值复制到this
。此代码段避免使用XmlIgnore属性复制属性。
答案 3 :(得分:2)
您想要的是一个静态工厂方法,用于创建您需要的对象。
class ArrivedDetails
{
///...
public static ArrivedDetails CreateFromEncryptedKey(string encrypted)
{
return DataProtect.deserializeXML(DataProtect.DecryptData(encrypted));
}
///...
您的初始方法不起作用的原因是因为this
是一个私有的只读实例字段,它返回从中调用它的对象。您无法写信至this
。