【问题标题】:Clone of Static Class静态类的克隆
【发布时间】:2016-04-20 14:37:42
【问题描述】:

我正在使用静态列表来保留一些字符串值,当应用程序启动时只需要一个静态列表就足够了,但是过了一段时间我需要在不同的静态列表中保留不同的字符串,有没有办法深拷贝或克隆一个在 C# 中运行时具有不同名称的静态类

public class Foo
{
    public static List<string> orders;
}

正如您在上面看到的,我可以轻松添加和删除静态 Foo.orders,但在运行时我需要另一个类,例如 Foo2 类。顺便说一下,列表必须是静态的,但是我需要从不同的类中获取列表,也不能在开发时创建新类,因为我不知道有多少静态列表

谢谢

【问题讨论】:

  • 这正是对象实例的用途。 “开发时无法创建新类”。我认为你错过了一些重要的东西。我认为一个更好的问题可能是“我如何在我的代码中传递对象的实例”或类似的东西。
  • 如果你需要在运行时添加一些东西,那么它就不是静态的。
  • “在运行时我需要另一个类,例如 Foo2 类”是什么意思?你的意思是你想要一个 second Foo 类,还是你真的在创建一个在运行时使用代码生成类?
  • 您是否只是为了方便而使用static 类?如果您需要执行任何类型的运行时操作,那么您可能需要传递一些东西,而不是使用对象的相同(且唯一)静态实例。
  • 我认为不可能

标签: c# reflection static activator


【解决方案1】:

您不能在运行时创建新的静态类,但可以保留一个静态列表字典:

public class Foo
{
     public static Dictionary<string,List<string>> Lists 
                                                      = new Dictionary<string,List<string>>
     {
         {"orders", new List<string>()}
     };
}

【讨论】:

    【解决方案2】:

    如果您绝对必须使用 static 类来处理此问题,并且您希望在实例化它之后对其进行操作(例如创建其他列表等),那么您可能会考虑创建另一个可以处理该行为的元素例如 List&lt;List&lt;string&gt;&gt;Dictionary&lt;string,List&lt;string&gt;&gt;

    public static Dictionary<string,List<string>> Orders = new Dictionary<string, List<string>>();
    

    如果您要使用字典,则可以为每个可用列表存储一个键(即List1List2,然后使用其键访问每个列表):

    Foo.Orders["List1"]; // yields your first list
    

    Foo.Orders.Add("List2",new List<string>()); // Create a new list in your Dictionary
    

    【讨论】:

      【解决方案3】:

      如果您真的必须在不传递实例的情况下方便地引用列表,那么您将希望摆脱静态类(根据定义是全局的)并进入存储在任何地方的单例领域您喜欢的范围(例如,为线程或执行路径缓存)。

      但是,我会认真考虑重新考虑您的方法,因为从它的声音来看,传递实例可能更合适。

      【讨论】:

        【解决方案4】:

        最佳做法是为您可能需要的每个可能的列表创建一个单独的公共静态字段。我会编写一个脚本来为至少 10,000 个列表生成代码。

        public class Foo
        {
            public static List<string> orders1;
            public static List<string> orders2;
            public static List<string> orders3;
            public static List<string> orders4;
            public static List<string> orders5;
            public static List<string> orders6;
            public static List<string> orders7;
            public static List<string> orders8;
            public static List<string> orders9;
            public static List<string> orders10;
            public static List<string> orders11;
            public static List<string> orders123;
            public static List<string> orders13;
            public static List<string> orders14;
            public static List<string> orders15;
            public static List<string> orders16;
            public static List<string> orders17;
            public static List<string> orders18;
            public static List<string> orders19;
            public static List<string> orders20;
            public static List<string> orders21;
            public static List<string> orders22;
            public static List<string> orders23;
            public static List<string> orders24;
            public static List<string> orders25;
            public static List<string> orders26;
            public static List<string> orders27;
            public static List<string> orders28;
            public static List<string> orders29;
            public static List<string> orders30;
            public static List<string> orders31;
            public static List<string> orders32;
            public static List<string> orders33;
            public static List<string> orders34;
            public static List<string> orders35;
        }
        

        【讨论】:

        • 这绝对是疯了。
        • 请不要浪费评论空间,人们需要它来制作真正的 cmets
        猜你喜欢
        • 2018-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多