是否可以在 C# 中使用 getType 函数运行静态方法?[复制]

Is it possible to run a static method using getType function in C#? [duplicate]

提问人:a11ex 提问时间:9/22/2023 更新时间:9/22/2023 访问量:48

问:

我有一个基类和一些具有一些静态方法的派生类。如果我只知道基类的对象,是否可以运行静态方法。

我尝试了 typeof 和 getType 方法来做到这一点,但正如我意识到的那样,它们只给出了 Type。我知道我的问题可以通过将 Type 与我的类进行比较来解决,最后它会正常工作。但我希望有更好的模式。

Type type = building.GetType();
type.arrangeCeremony(); // arrange ceremony is public static method in all derived classes

感谢您的回答

C# static-methods getType

评论

3赞 Sweeper 9/22/2023
你可以用反射来做到这一点,但是如果你需要这样称呼它们,为什么它们首先是静态的呢?
3赞 Fildor 9/22/2023
x-y。请解释一下,你想用这个做什么。我非常有信心有一个(更好的)解决方案。
1赞 user16606026 9/22/2023
如果你知道基类的对象,这意味着它有实例,不再需要静态函数。您应该提取到接口中并将其分配给基类,现在所有派生类也都实现了这一点。然后,只要你有这种基类的对象,你就可以调用。ArrangeCeremony()ArrangeCeremony()
3赞 Jamiec 9/22/2023
请向我们展示更多代码,我很确定有人可以解释如何以“正确”的方式做到这一点
0赞 Fildor 9/22/2023
^^这。特别解释一下,为什么这种方法是.这是硬性要求吗?static

答:

0赞 Marc Gravell 9/22/2023 #1

如果操作取决于类型:最合理的实现方式很简单:多态性。

因此:使方法成为非静态的,并将其移动到基类型,如 或 ,然后将其移动到子类型中。然后你不需要问建筑物它是什么类型:你只需要使用多态性virtualabstractoverride

building.ArrangeCeremony();

abstract class SomeBase {
    public abstract void ArrangeCeremony();
}
class SomeConcrete : SomeBase {
    public override void ArrangeCeremony() { /* code here */ }
}

如果不是所有类型都可以合理地实现该方法,那么也许可以创建一个 ,或者在某个合理的中间类型级别声明该方法,并使用类型测试:interface

if (building is ICeremonial ceremonial)
{
    ceremonial.ArrangeCeremony();
}

class SomeBase { }
interface ICeremonial {
    void ArrangeCeremony();
}
class SomeConcrete : SomeBase, ICeremonial {
    public void ArrangeCeremony() { /* code here */ }
}

if (building is Ceremonial ceremonial)
{
    ceremonial.ArrangeCeremony();
}

class SomeBase { }
abstract class Ceremonial : SomeBase {
    public abstract void ArrangeCeremony();
}
class SomeConcrete : Ceremonial {
    public override void ArrangeCeremony() { /* code here */ }
}

评论

0赞 a11ex 9/22/2023
谢谢!是的,我知道多态性。我不能使用它,因为我在大学里的愚蠢任务。我需要在每个类中都有静态方法,所以我不能使用虚拟
1赞 Marc Gravell 9/22/2023
@a11ex每个多态重写都可以只调用相关的静态方法吗?
0赞 a11ex 9/23/2023
哇,好主意,谢谢