C#克隆静态类[重复]

Posted

技术标签:

【中文标题】C#克隆静态类[重复]【英文标题】:C# clone static class [duplicate] 【发布时间】: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 类中声明一个类? 创作者的意图未知。我需要静态类中的更多数据。但是,数据量很大。所以我想高效地创建一个克隆。 【参考方案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 然后克隆它才有意义。 谢谢。我再试一次 @제일일 我添加一个示例希望可以帮助你 哇,谢谢你的帮助。我意识到我做错了什么。您已经稍微修改了您的酱汁以使其发挥作用。

以上是关于C#克隆静态类[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C#替代静态类的继承[重复]

C#:在所有派生类中具有*必需*实现的静态基类方法存根[重复]

访问静态变量 C# [重复]

如何在c#中使用C++ dll导出类[重复]

C# 静态类 单例模式 对比

其他功能的静态类的理想类名[重复]