winforms - предлагаемая структура класса и клон (не по ссылке) - PullRequest
0 голосов
/ 18 октября 2011

Мой класс программы имеет:

Application.Run(new Form1());

в классе form1 У меня есть:

model = new Model(this);
modelarray myArray = new modelarray(this);
model = myArray.models[0];
myArray.models[1] = (Model) model.Clone();

    private void btn13_Click(object sender, EventArgs e)
    {
        model.btn13Clicked();
    }

    private void btnGetBackClone_Click(object sender, EventArgs e)
    {
        model = myArray.models[1];
        //here I'm expecting to get the original object back (ie. with btns[7,7].Visible = True) but it doesn't work!!
    }

в классе модели У меня есть:

private Button[,] btns;

public Model(Form1 form1)
{
btns = new Button[10,10];
myform = form1;
btns[8, 6] = form1.btn1;
btns[9, 5] = form1.btn2;
btns[7, 7] = form1.btn13;

}

public void btn13Clicked()
{
   btns[7, 7].Visible = False;
}

public object Clone()
{
  return this.MemberwiseClone();
}

в классе modelarrayУ меня есть:

public Model[] models = new Model[19];
public modelarray(Form1 form1)
{
  models[0] = new Model(form1);
}

Обратите внимание на мой комментарий в методе btnGetBackClone_Click."// здесь я ожидаю получить исходный объект (т.е. с помощью btns [7,7] .Visible = True), но он не работает !!"

Я понимаю, что это потому, чтомодели [0] и модели [1] указывают на одну и ту же ячейку памяти (т. е. копирование по ссылке).Но я действительно теряюсь в том, как реализовать решение в этой ситуации.Поиски по «глубокому копированию», похоже, не помогли, так как сериализация формы не сработала.Может кто-нибудь исправить мою ошибку клонирования?

Я знаю, что мог бы просто повторить "btns [7, 7] .Visible = True;"но я хотел бы узнать решение для клонирования, чтобы оно скопировало все будущие поля, которые я решил добавить в свою модель.

У меня был поиск по codeproject.etc, но, похоже, ничего простоговведение в winforms.

1 Ответ

1 голос
/ 18 октября 2011

.NET обычно использует неглубокие копии во время операций клонирования.

Для реализации глубоких копий у вас обычно есть 2 варианта

  1. Сериализация / десериализация (если все ваши классы сериализуемы) - например, Здесь
  2. С помощью отражения, например, Здесь

Если вы отделите данные (модель) от проблем из вашей формы (вид), тогда вы можете легче "клонировать" только данные.

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