【问题标题】:Using different versions of class with static method使用具有静态方法的不同版本的类
【发布时间】:2023-04-05 18:50:01
【问题描述】:

我使用了一些具有静态方法类的库。

namespace lib
{
    public class libClass
    {
        ...
        public static int num;
        public static void libMethod(int arg)
        {
            num = arg;
        }
    }
}

我需要在我的程序的两个不同位置(在不同的命名空间中)使用这个类的两个实例。问题是这些实例应该相互独立(libClass.num 可以不同)。

如果你能帮我解决这个问题,我会很高兴。感谢您的阅读。

【问题讨论】:

  • 您的问题不清楚。你到底有什么问题?
  • 你想达到什么目的?您希望从两个不同的命名空间调用“libClass.libMethod”?
  • 我认为他担心如果他引用 libClass.num 它将在两个命名空间中保持相同的值。 @Centuri0n:我的假设是否正确?
  • @Amicable 是的,就是这样。
  • 这在技术上可以通过创建另一个 AppDomain 来完成。从这个问题来看,这是否是一个可行的解决方案完全无法猜测。

标签: c# class static-methods


【解决方案1】:

目前还不太清楚你为什么会出现这种情况,即。你能做什么和不能做什么。

理想情况下,我会创建一个类的实例,避免整个问题,但我认为你不能或不想这样做是有原因的?

否则解决这个问题的最简单和最干净的方法可能是只制作两个类的副本,并在每个命名空间中放置一个,每个都有自己的静态变量。 我强烈建议也给这些类起不同的名称,只是为了清楚起见并避免以后混淆。

您的最终选择是寻找完全不同的解决方案。很难在不了解您的场景的情况下说,但如果您真的不能使用实例,那么似乎num 可能根本不应该是这个类的责任。

显然,您希望在某些逻辑上下文/范围内存储和使用num;你应该问问自己在你的范围内你还有哪些其他选择(除了那个类)(希望这不是太抽象^^)。

更新:

我现在明白你的意思了。但是,我认为您应该能够覆盖该课程。试试这样的:

    using VariousTesting;

    namespace VariousTesting
    {
    public class LibClass
        {        
            public static int num;
            public static void libMethod(int arg)
            {
                num = arg;
            }
        }
    }

    namespace VariousTesting2
    {
        public class SubLibClassA : LibClass
        {

            public static int num;
            public static void libMethod(int arg)
            {
                num = arg;
            }

            public static int GetNum()
            {
                return num;
            }
        }
    }

    namespace VariousTesting2
    {
        public class SubLibClassB : LibClass
        {
            public static int num;
            public static void libMethod(int arg)
            {
                num = arg;
            }

            public static int GetNum()
            {
                return num;
            }
        }
    }

你可以如下测试:

        SubLibClassA.libMethod(1);
        Console.WriteLine(SubLibClassA.GetNum());  // 1

        SubLibClassB.libMethod(2);
        Console.WriteLine(SubLibClassB.GetNum());  // 2
        Console.WriteLine(SubLibClassA.GetNum()); // still 1! Yay! :D

【讨论】:

  • 感谢您的回答!我无法创建类的副本,因为我只有 dll 并且没有它的源代码(这就是为什么我不能更改类的结构)。我没有通过创建实例获得解决方案 - libClass.num 是静态的,并且对于所有实例都是相同的。
  • 这几乎是我需要的!但是还有另一个问题,正如我所说,我没有libMethod 的代码,我唯一知道它以某种方式改变了num。在这种情况下可以覆盖吗?
  • @centuri0n:您可以使用ilSpy 反编译第3 方DLL,看看它如何使用num 变量。但是,您仍然应该能够创建一个新类并通过继承它来覆盖 num,如 Kjartan 的示例 public class SubLibClassA : LibClass
猜你喜欢
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多