Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Копия класса


Автор: IEZ 24.9.2008, 14:11
Приветствую Всех!
Есть класс:
Код

class Test
{
        public UInt32 Code;
}


Есть форма (диалог DlgForm), в которой объявлены переменные:
public Object objtest;
Test test=null;

Далее делаю:
Код

Test tnew=null;
Test t=null;
t=new Test();
t.Code=123455;

DlgForm dlg=new DlgForm ();
dlg.objtest=t;
if (dlg.ShowDialog() == DialogResult.OK)
{

}


В самом диалоге (DlgForm_Load(object sender, EventArgs e)) делаю следующее:
Код

DlgForm dialog=(DlgForm)sender;
test=(Test)dialog.objtest;


Далее в диалоге по нажатию кнопки OK заполняю новые данные (к примеру):
Код

test.Code=54321;
dialog.objtest=test;
dialog.DialogResult = DialogResult.OK;


Выйдя из диалога в обработчике DialogResult.OK:
Код

if (dlg.ShowDialog() == DialogResult.OK)
{
tnew=(Test)dlg.objtest; <--- здесь я получаю, что t.Code=54321 и tnew.Code=54321
}


А мне нужно на выходе получить t.Code=12345 и tnew.Code=54321.

Вопрос как мне в диалоге получить копию класса из 
Код

test=(Test)dialog.objtest;

Чтобы при изменение оного не изменялся исходник?
Спасибо.

Автор: Ctrl 25.9.2008, 00:49
Hi
Получить копию класса можно очень многими способами - все зависит от специфических особенностей этого класса и необходимого уровня абстракции при реализации.

Вот пример, основанный на бинарной сериализации (о классе известно только то, что он может сериализиться).
Код

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Windows.Forms;
using System;

namespace EditObjectCopyTest {
    public partial class TestForm : Form {
        Foo foo;
        public TestForm() {
            InitializeComponent();
            foo = new Foo();
            foo.ID = 12345; // init source object
        }
        private void OnEditButtonClick(object sender, EventArgs e) {
            using (FooEditForm editForm = new FooEditForm(foo)) {
                if (editForm.ShowDialog() == DialogResult.OK) {
                    Foo newValue = (Foo)editForm.EditValue;
                    //.. do something with new value
                }
            }
        }
    }
    //
    [Serializable]
    public class Foo {
        int objID;
        public int ID {
            get { return objID; }
            set { objID = value; }
        }
    }
    public class FooEditForm : BaseEditForm {
        public FooEditForm(Foo foo) : base(foo) { }
        protected override void OnLoad(EventArgs e) {
            base.OnLoad(e);
            ((Foo)EditValue).ID = 54321; //Edit object copy
        }
    }
    public abstract class BaseEditForm : Form {
        object editValueCore;
        protected BaseEditForm(object value) {
            this.editValueCore = MakeEditableCopy(value);
        }
        public object EditValue {
            get { return editValueCore; }
        }
        protected object MakeEditableCopy(object value) {
            object copy=null;
            BinaryFormatter formatter = new BinaryFormatter();
            using(MemoryStream ms = new MemoryStream()){
                formatter.Serialize(ms,value);
                ms.Seek(0, SeekOrigin.Begin);
                copy = formatter.Deserialize(ms);
                ms.Close();
            }
            return copy;
        }
    }
}

Автор: Alekz 25.9.2008, 11:16
Цитата

Чтобы при изменение оного не изменялся исходник?


Работать с копией.
А в твоем случае легче всего использовать структуры.


Код

if (dlg.ShowDialog() == DialogResult.OK)
{
tnew=(Test)dlg.objtest; <--- здесь я получаю, что t.Code=54321 и tnew.Code=54321
}



Естественно, потому что dlg.objtest содержит ссылку на тот же объект, что и t.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)