Что-то не так с этим кодом? Я не считаю, что мне нужно создавать новый экземпляр объекта для изменения коллекции - PullRequest
1 голос
/ 24 сентября 2011

Я испытываю странное поведение, которое исчезает / появляется вновь в зависимости от того, является ли этот словарь новым экземпляром объекта или старым экземпляром объекта.Позвольте мне сначала предоставить весь код.

/// <summary>
/// Removes a control from monitoring/Session/Database based on ID.
/// </summary>
public static void Remove<T>(ICormantControl<T> control)
{
    _logger.InfoFormat("Removing {0}", control.ID);
    SerializableDictionary<string, T> states = new SerializableDictionary<string,T>(GetStates<SerializableDictionary<string, T>>());
    ((IDictionary)states).Remove(control.ID);
    SetStates(states);
}

/// <summary>
/// Retrieves information on an object. If the object is cached to Session then the
/// cached object is retrieved. Else, it is retrieved from the database.
/// </summary>
/// <typeparam name="T"> The type of object expected to get back.</typeparam>
/// <returns> Collection of data for the specific object type.</returns>
public static T GetStates<T>() where T : new()
{
    T states = new T();

    string stateName = GetStateNameFromType(typeof(T));

    if (!Equals(SessionRepository.Instance.GetSession(stateName), null))
    {
        states = (T)SessionRepository.Instance.GetSession(stateName);
    }
    else
    {
        XmlSerializer serializer = new XmlSerializer(states.GetType());
        string data = DatabaseRepository.Instance.GetWebLayoutData(stateName);

        if (!string.IsNullOrEmpty(data))
        {
            byte[] dataAsArray = Convert.FromBase64String(data);
            MemoryStream stream = new MemoryStream(dataAsArray);
            states = (T)serializer.Deserialize(stream);
        }
        SessionRepository.Instance.SetSession(stateName, states);
    }

    return states;
}

public static void SetStates<T>(T states) where T : new()
{
    string stateName = GetStateNameFromType(typeof(T));
    SessionRepository.Instance.SetSession(stateName, states);
    if (shouldWriteToDatabase) DatabaseRepository.Instance.SaveToDatabase(stateName, states);
}

/// <summary>
/// Recreates the page state recursively by creating a control and looking for its known children.
/// </summary>
/// <param name="pane"> Pane having children added to it.</param>
private void RegeneratePaneChildren(CormantRadPane pane)
{
    _logger.InfoFormat("Initializing paneToResize children for paneToResize {0}", pane.ID);
    foreach (var splitterState in StateManager.GetStates<SerializableDictionary<string, RadSplitterSetting>>())
    {
        RadSplitterSetting splitterSetting = splitterState.Value;

        if (!splitterSetting.ParentID.Contains(pane.ID)) continue;

        CormantRadSplitter splitter = new CormantRadSplitter(splitterSetting);
        pane.UpdatePanel.ContentTemplateContainer.Controls.AddAt(0, splitter); //Visibility will fight with splitter if you don't re-add like this.
        RegenerateSplitterChildren(splitter);
    }
}

/// <summary>
/// Recreates the page state recursively by creating a control and looking for its known children.
/// </summary>
/// <param name="splitter"> Splitter having children added to it. </param>
public void RegenerateSplitterChildren(RadSplitter splitter)
{
    _logger.InfoFormat("Initializing splitter children for splitter {0}", splitter.ID);
    foreach (var paneState in StateManager.GetStates<SerializableDictionary<string, RadPaneSetting>>()
        .Where(paneState => paneState.Value.ParentID.Contains(splitter.ID)))
    {
        RadPaneSetting paneSetting = paneState.Value;

        CormantRadPane pane = new CormantRadPane(paneSetting);

        StyledUpdatePanel updatePanel = pane.CreateUpdatePanel(paneSetting.UpdatePanelID);
        pane.Controls.Add(updatePanel);

        splitter.Controls.Add(pane);
        RegeneratePaneChildren(pane);

        InsertSplitBar(splitter);
    }
}

Ключевая строка, на которую следует обратить внимание во всем этом: SerializableDictionary<string, T> states = new SerializableDictionary<string,T>(GetStates<SerializableDictionary<string, T>>());

Если эта строка кода изменена так, что она несоздать новый экземпляр состояний (вместо этого используя объект, сохраненный в сеансе), мой код «рассинхронизируется», и я испытываю странное поведение с моими методами регенерации.Объект, который должен иметь «ObjectA» в качестве родителя, вместо этого имеет «ObjectB» в качестве родителя.

Происходит много изменений коллекции ... Я удаляю элемент управления из состояний и повторно-сохраняя это ... но я не вижу, где я делаю что-то явно некорректное в этом коде.Тем не менее, я все еще чувствую, что у меня должна быть возможность выразить приведенную выше строку кода без создания нового экземпляра объекта.

Если кто-нибудь увидит очевидную ошибку, я бы с удовольствием это услышал.Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...