C# 从子继承类获取父类的静态成员

C# 从子继承类获取父类的静态成员,c#,class,C#,Class,假设我有 public class A { public static void MyAMethod() { } public class B { } } public class C : A.B { public void MyCMethod() { MyAMethod();// I need to call this } } 现在我需要给C班的MyAMethod打电话 编辑:在我的

假设我有

public class A
{
    public static void MyAMethod()
    {
    }

    public class B
    {

    }        
}

public class C : A.B
{
    public void MyCMethod()
    {
        MyAMethod();// I need to call this
    }
}
现在我需要给C班的MyAMethod打电话


编辑:在我的情况下,A类课程不可用。所以,我不能用MyAMethod

您可以从方法内部调用
A.MyAMethod()
,因为它是静态的

您可以从方法内部调用
A.MyAMethod()
,因为它是静态的

public class C : A.B
{
    public void MyCMethod()
    {
        A.MyAMethod();// I need to call this
    }
}
由于该方法是静态的,您可以通过类A从任何地方调用它

public class C : A.B
{
    public void MyCMethod()
    {
        A.MyAMethod();// I need to call this
    }
}

由于该方法是静态的,因此您可以通过类A从任何位置调用它

您将MyMethod设置为静态的,因此只需在MyCMehtod()中调用
A.MyMethod()


关于

您将MyAMethod设置为静态,因此只需在MyCMehtod()中调用
A.MyAMethod()


关于

静态方法、字段、属性或事件可在类上调用,即使尚未创建该类的实例。并根据中给出的数据。您可以使用类名直接调用静态成员。那么,在你的情况下


A.MyAMethod()将完成这项工作。

即使未创建类的实例,也可以在类上调用静态方法、字段、属性或事件。并根据中给出的数据。您可以使用类名直接调用静态成员。那么,在你的情况下


A.MyAMethod()
将完成这项工作。

您不能通过这种方式直接调用
MyAMethod()
,因为它不属于
类B
,而您正在继承类B;相反,它是
class a
的静态成员,因此在调用
a.MyAMethod()之前必须对其进行限定

如果您继承的是
类A
,那么您的代码会很好,因为类C也会继承该方法

更改代码以适应您想要的内容

public class A
    {
        public static void method()
        {
            Console.WriteLine("method in base class");  
        }
    public class B
    {
        public void bmethod()
        {
            A.method(); 
        }
    }
}

public class C : A.B
{
    public void cmethod()
    {
        bmethod(); 
    }
}

您不能以这种方式直接调用
MyAMethod()
,因为它不属于
类B
,并且您继承了类B;相反,它是
class a
的静态成员,因此在调用
a.MyAMethod()之前必须对其进行限定

如果您继承的是
类A
,那么您的代码会很好,因为类C也会继承该方法

更改代码以适应您想要的内容

public class A
    {
        public static void method()
        {
            Console.WriteLine("method in base class");  
        }
    public class B
    {
        public void bmethod()
        {
            A.method(); 
        }
    }
}

public class C : A.B
{
    public void cmethod()
    {
        bmethod(); 
    }
}

如果你看一下

namespace NestedTest
{
    public class A
    {
        public static void MyAMethod()
        {
            System.Console.WriteLine("public static void MyAMethod()");
        }

        public class B
        {
            public void MyBMethod()
            {
                MyAMethod();
            }
        }
    }
}
您会发现
MyBMethod
实现为(?)

正如您所看到的,对NestedTest.A::MyAMethod()的调用是硬编码的,即“魔力”已经由C#->IL编译器完成。(*)
您可以通过反射获得调用静态方法所需的信息,例如(没有错误处理,而且相当粗糙)

但是,对于您的具体问题,可能有更好的解决方案


(*),而c#编译器仅按照

3.7范围

名称的范围是程序文本的区域,在此区域内可以引用名称声明的实体,而无需限定名称[…]


-类别成员声明(§10.1.6)所声明的成员范围是声明发生的类别主体。此外,类成员的范围扩展到成员的可访问域(§3.5.2)中包含的派生类的类主体。

类B
是类a的类主体的一部分,
类C
不是。而且
C类
也不是从A类派生出来的。

如果你看一下

namespace NestedTest
{
    public class A
    {
        public static void MyAMethod()
        {
            System.Console.WriteLine("public static void MyAMethod()");
        }

        public class B
        {
            public void MyBMethod()
            {
                MyAMethod();
            }
        }
    }
}
您会发现
MyBMethod
实现为(?)

正如您所看到的,对NestedTest.A::MyAMethod()的调用是硬编码的,即“魔力”已经由C#->IL编译器完成。(*)
您可以通过反射获得调用静态方法所需的信息,例如(没有错误处理,而且相当粗糙)

但是,对于您的具体问题,可能有更好的解决方案


(*),而c#编译器仅按照

3.7范围

名称的范围是程序文本的区域,在此区域内可以引用名称声明的实体,而无需限定名称[…]


-类别成员声明(§10.1.6)所声明的成员范围是声明发生的类别主体。此外,类成员的范围扩展到成员的可访问域(§3.5.2)中包含的派生类的类主体。

类B
是类a的类主体的一部分,
类C
不是。而
类C
也不是从类A派生的。

我知道我可以这样做,但我需要直接调用它。例如,在类B中,我可以直接调用MyMethod。这是因为您是从B继承的,而不是从A继承的。因此,您必须像调用其他静态方法一样调用它。在我的情况下,类A不可用。所以,我不能用MyAMethod。类C是由一个框架(用B继承)动态生成的。A班对我来说没空。不要太听懂。。。如果你的班级有A.B,那么A必须是可用的。你是说C类完全是动态生成的,你不能改变MyCMethod的实现吗?是的。我使用的框架是通过继承带有A.B的类来动态生成类。我只能直接调用A.B的静态成员。因此,我正在考虑是否可以调用类A的成员。该类是动态生成的,我可以在其中添加自己的自定义方法。类似于动态生成类的ASP.NET,但我可以在这个类中添加我自己的方法。我知道我可以这样做,但我需要直接调用它。例如,在类B中,我可以直接调用MyMethod。这是因为您是从B继承的,而不是从A继承的。因此,您必须像调用其他静态方法一样调用它。在我的情况下,类A不可用。所以,我不能使用