C# 在隔离存储设置中存储后避免空字段

C# 在隔离存储设置中存储后避免空字段,c#,silverlight,isolatedstorage,datacontract,C#,Silverlight,Isolatedstorage,Datacontract,在Silverlight上,我得到了一个DataContract,如下所示: [DataContract] class Operation { [DataMember] public string Name; public readonly OperationManager Manager = new OperationManager(); } 我不想存储或序列化管理器,这就是为什么它不是DataMember。执行新操作()时,管理器不为空。但是当我从Isolated

在Silverlight上,我得到了一个
DataContract
,如下所示:

[DataContract]
class Operation
{
    [DataMember]
    public string Name;

    public readonly OperationManager Manager = new OperationManager();
}
我不想存储或序列化管理器,这就是为什么它不是
DataMember
。执行
新操作()
时,管理器不为空。但是当我从
IsolatedStorageSettings
检索它时,我得到一个空管理器:


当通过
隔离存储设置将Manager取消序列化时,是否有方法自动将其重新初始化为新的内容?我试图在构造函数中设置它,但在执行
隔离存储设置时未调用构造函数

我没有使用Silverlight或隔离存储设置的经验,因此我不知道是否有任何特殊技巧,但一个简单的解决方案是使用一个属性,并在必要时在其中实例化
OperationManager

private OperationManager manager; // no longer readonly

public OperationManager Manager
{
    get
    {
        if (manager == null) manager = new OperationManager();
        return manager;
    }
}

初始化来自
IsolatedStorageSettings
的内容的解决方案是
[OnDeserialization]
[OnDeserialization]
(不能使用
.ctor(SerializationInfo,StreamingContext上下文)
,因为在Silverlight上不可用)


[OnDeserialized]
[OnDeserialized]
必须在Windows Phone 7上是内部的,在Visual Studio 2013上是私有的-_-

但是,它不仅在
get
上是非空的。如果我在某个时候没有
get
,则OperationManager不会实例化。我需要它的一个实例来执行自动后台任务。我正在寻找一种方法,以便在访问
Settings[“key”]
时立即对其进行初始化,例如。@Cœur如果您只需要它,那么为什么它会出现在操作类中?每个操作实例是否需要一个OperationManager?需要。我简化了我的示例,但每个实例都需要一个实例。@Cœur但它必须是Operation类的字段吗?如果不是,则可以在反序列化操作时创建一个管理器对象。但是看起来你把你的问题简化了一点。很抱歉,如果这个答案没有真正的帮助,但我会让它留在这里,因为它可能会向其他人展示你不需要的东西。
private OperationManager manager; // no longer readonly

public OperationManager Manager
{
    get
    {
        if (manager == null) manager = new OperationManager();
        return manager;
    }
}
[DataContract]
class Operation
{
    [DataMember]
    public string Name;

    OperationManager _manager = new OperationManager();
    public OperationManager Manager { get { return _manager; } }

    [OnDeserializing]
#if WP7
    internal
#endif
    void OnDeserializing(StreamingContext c)
    {
        _manager = new OperationManager();
    }
}