相关疑难解决方法(0)

为什么我不能在C#中使用抽象静态方法?

我最近一直与提供商合作,我遇到了一个有趣的情况,我希望有一个抽象的静态方法.我读了一些关于这个主题的帖子,这有点意义,但有一个很清楚的解释吗?

.net c# language-design

175
推荐指数
8
解决办法
10万
查看次数

C#虚拟(或抽象)静态方法

静态继承就像实例继承一样工作.除非您不允许将静态方法设为虚拟或抽象.

class Program {
    static void Main(string[] args) {
        TestBase.TargetMethod();
        TestChild.TargetMethod();
        TestBase.Operation();
        TestChild.Operation();
    }
}

class TestBase {
    public static void TargetMethod() {
        Console.WriteLine("Base class");
    }

    public static void Operation() {
        TargetMethod();
    }
}

class TestChild : TestBase {
    public static new void TargetMethod() {
        Console.WriteLine("Child class");
    }
}
Run Code Online (Sandbox Code Playgroud)

这将输出:

Base class
Child class
Base class
Base class
Run Code Online (Sandbox Code Playgroud)

但我想要:

Base class
Child class
Base class
Child class
Run Code Online (Sandbox Code Playgroud)

如果我可以在静态方法上,我会使TargetMethod虚拟,它会完成这项工作.但有没有可以达到同样的效果?

编辑:是的,我可以在子类中放置一个Operation副本,但这需要复制并将大量代码粘贴到每个子节点,在我的例子中大约是35个类,这是一个维护噩梦.

c# inheritance

12
推荐指数
2
解决办法
1万
查看次数

如何实现虚拟静态属性?

据我所知C#,不支持虚拟静态属性.如何实现这样的行为C#

我想归档基类的所有派生类必须覆盖静态属性.获取派生类型,我想访问一个名为的静态属性Identifier

Type t = typeof(DerivedClass);
var identifier= (String) t.GetProperty("Identifier", BindingFlags.Static).GetValue(null, null);
Run Code Online (Sandbox Code Playgroud)

c# virtual static properties

9
推荐指数
2
解决办法
1万
查看次数

要求接口实现具有静态Parse方法

我有一个最小的接口,并将处理其类实现此接口的对象的集合.该集合(及其相关功能)不关心这些对象的名称之外的任何细节,将它们转换为XML的能力以及从XML解析它们的能力.

接口的未来实现将使用集合的元素做更多的事情,并且显然将实现它们自己的Parse和ToXml方法(集合将使用它们在遇到时适当地解析这些项​​).

不幸的是,我无法在界面中列出静态Parse方法(我已经阅读了 三个 问题).让Parse方法需要一个实例对我来说没有意义.有没有办法要求接口的所有实现都有静态Parse方法?

public interface IFoo
{
  string Name { get; }

  string ToXml();

  static IFoo Parse(string xml); // Not allowed - any alternatives?
}
Run Code Online (Sandbox Code Playgroud)

c# static interface

5
推荐指数
1
解决办法
1709
查看次数