【问题标题】:C# clone static class [duplicate]C#克隆静态类[重复]
【发布时间】:2018-08-28 17:20:16
【问题描述】:

我研究了一天的深拷贝,但我还是不太明白。

这就是我想要的。

静态类 MyList

List<MenuData> Menu1 = MenuList.Menus.ToList();
List<MenuData> Menu2 = MenuList.Menus.ToList();

我在删除方法上使用 Menu2。 但是,Menu1 也被删除了。 我发现Menu1和Menu2因为Swallow Copy一起被删除了。

他们还提到了其他人的样本,但失败了。

static class MenuList
{
    public class MenuData
    {
        public string ID { get; set; }
        public string Text { get; set; }
        public string Image { get; set; }
        public Boolean Expanded { get; set; }
    }

    public static List<MenuData> Menus = new List<MenuData>()
    {
        new MenuData {
            ID = "1",
            Text = "Service",
            Image = "file_path.png",
            Expanded = false
        },
    };

    public static T Clone<T>(T obj)
    {
        using (var ms = new MemoryStream())
        {
            var formatter = new BinaryFormatter();
            formatter.Serialize(ms, obj);
            ms.Position = 0;
            return (T)formatter.Deserialize(ms);
        }
    }

    public static List<MenuData> CopyMenus = MenuList.Clone(MenuList.Menus);
}

ErrMessage : The format 'Models.MenuData' is not marked serializable.

要求减少进一步的时间浪费。

【问题讨论】:

  • 如何克隆static 类有意义?克隆是创建对象的副本。 static 类不能被实例化,所以你一开始就不能创建一个对象,那么你怎么能复制一个呢?
  • 为什么要在 static 类中声明一个类?
  • 创作者的意图未知。我需要静态类中的更多数据。但是,数据量很大。所以我想高效地创建一个克隆。

标签: c# asp.net


【解决方案1】:

我不知道你为什么要克隆一个静态类

但如果你想Serialize 对象,你需要使用属性Serializable 来标记你的序列化类。

[Serializable]
public class MenuData
{
    public string ID { get; set; }
    public string Text { get; set; }
    public string Image { get; set; }
    public Boolean Expanded { get; set; }
}

serialization

编辑

如果你想克隆对象,你的克隆类可以实现ICloneable接口。

这是一个示例。

public class MenuList
{
    public List<MenuData> Menus { get; private set; }

    public MenuList()
    {
        Menus = new List<MenuData>()
        {
            new MenuData {
                ID = "1",
                Text = "Service",
                Image = "file_path.png",
                Expanded = false
            },
        };
    }

    public class MenuData : ICloneable
    {
        public string ID { get; set; }
        public string Text { get; set; }
        public string Image { get; set; }
        public Boolean Expanded { get; set; }

        public object Clone()
        {
            return new MenuData()
            {
                ID = this.ID,
                Text = this.Text,
                Expanded = this.Expanded,
                Image = this.Image
            };
        }
    }

    public List<MenuData> CloneMenus()
    {
        return Menus.Select(o => (MenuData)o.Clone()).ToList();
    }
}

你可以在外面获取克隆列表。

MenuList list = new MenuList();
List<MenuData> CloneList = list.CloneMenus();

【讨论】:

  • 我想保存静态类 Origin 数据。顺便说一句,该方法更改了原始静态类数据。我想避免这种情况。我的技能还不够。除了这个,你能告诉我吗?
  • 我认为你不能克隆一个静态字段。那没有意义。你需要创建一个对象 List 然后克隆它才有意义。
  • 谢谢。我再试一次
  • @제일일 我添加一个示例希望可以帮助你
  • 哇,谢谢你的帮助。我意识到我做错了什么。您已经稍微修改了您的酱汁以使其发挥作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
  • 2013-07-28
  • 1970-01-01
  • 2012-01-16
  • 2014-01-09
  • 1970-01-01
相关资源
最近更新 更多