C#clone static class

时间:2018-03-20 01:25:54

标签: c# asp.net

我当天研究过很多副本,但我还是不太明白。

这就是我想要的。

静态类MyList

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

我在删除方法上使用Menu2。 但是,Menu1也被删除了。 我意识到由于Swallow Copy,Menu1和Menu2被一起删除。

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

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.

有人要求减少浪费时间。

1 个答案:

答案 0 :(得分:0)

我不知道您为什么要克隆静态类

但如果你想要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();