Скопируйте объект словаря в ASP.Net - PullRequest
1 голос
/ 12 июля 2011

Мой сериализуемый класс находится ниже, и я пытаюсь заставить его правильно копировать.

    public class AppContext : IXmlSerializable 
    {
        public bool autoGeneratedTitle = true;
        public bool truncateLabels = false;

        public IDictionary<string, OPTIONS> dict_Options = new Dictionary<string, OPTIONS>();
        // Advanced Options
        public List<string> listAdvancedOptions = new List<string>();

        public IDictionary<string, string> dictFilterPermissions = new Dictionary<string, string>();




        public class OPTIONS {
            public string subjectId = string.Empty;
            public string varNumber = string.Empty;
            public string varName = string.Empty;
            public string format = string.Empty;
            public string varLabel = string.Empty;

            public IDictionary<string, string> dictTagElements = new Dictionary<string, string>();
            public IDictionary<string, string> dictRefElements = new Dictionary<string, string>();
            ////TJM add includeZero
            public string includeZero = string.Empty;
        }


        public void CopyContext(AppContext copy)
        {

            autoGeneratedTitle = copy.autoGeneratedTitle;
            truncateLabels = copy.truncateLabels;

            dict_Options = ?;
            dictFilterPermissions = ?;
            listAdvancedOptions = ?;
        }
    }

Как правильно скопировать dict_Options, dictFilterPermissions и listAdvancedOptions?

Ответы [ 2 ]

0 голосов
/ 12 июля 2011

Нашел это онлайн по ссылке с форума .NET.

    public virtual AppContext DeepClone()
    {
        //First do a shallow copy.
        AppContext returnData = (AppContext)this.MemberwiseClone();

        //Get the type.
        Type type = returnData.GetType();

        //Now get all the member variables.
        FieldInfo[] fieldInfoArray = type.GetFields();

        //Deepclone members that extend AppContext.
        //This will ensure we get everything we need.
        foreach (FieldInfo fieldInfo in fieldInfoArray)
        {
            //This gets the actual object in that field.
            object sourceFieldValue = fieldInfo.GetValue(this);

            //See if this member is AppContext
            if (sourceFieldValue is AppContext)
            {
                //If so, cast as a AppContext.
                AppContext sourceAppContext = (AppContext)sourceFieldValue;

                //Create a clone of it.
                AppContext clonedAppContext = sourceAppContext.DeepClone();

                //Within the cloned containig class.
                fieldInfo.SetValue(returnData, clonedAppContext);
            }
        }
        return returnData;
    }

Похоже, что это работает и использовать его так:

      AppContext tempContext = new AppContext();

        tempContext = appContext.DeepClone();
0 голосов
/ 12 июля 2011

Я не уверен, что это то, что вы хотите, но, возможно, вы хотите клонировать словарь / список.Если вам нужно клонировать словарь, но не объекты внутри него, и вы получите только копию ссылок, тогда вы можете использовать конструктор словаря по умолчанию.См. Вопрос для дальнейшего объяснения: Каков наилучший способ клонирования / глубокого копирования универсального словаря .NET?

Если вам нужен глубокий клон (осторожно, это тяжелая операция), вы должны реализовать его самостоятельно, но это не так сложно: унаследовать от словаря, реализовать ICloneable и убедиться с предложением whereтипы, используемые в качестве ключа / значения, также реализуют ICloneable.

Прочитайте ответ на этот вопрос, который также объясняет эту часть

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