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

本文关键字:父类 静态成员 获取 继承 | 更新日期: 2023-09-27 18:16:13

假设我有

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。

Edit:在我的情况下,A类不可用。我不能使用。myamethod。

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

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

看一下

的IL代码
namespace NestedTest
{
    public class A
    {
        public static void MyAMethod()
        {
            System.Console.WriteLine("public static void MyAMethod()");
        }
        public class B
        {
            public void MyBMethod()
            {
                MyAMethod();
            }
        }
    }
}

你会发现MyBMethod被实现为

.method public hidebysig instance void  MyBMethod() cil managed
{
  // Code size       8 (0x8)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  call       void NestedTest.A::MyAMethod()
  IL_0006:  nop
  IL_0007:  ret
} // end of method B::MyBMethod
正如你所看到的,对NestedTest.A::MyAMethod()的调用是硬编码的,即"魔术"已经由c# ->IL编译器完成了。(*)
您可以通过反射获得调用静态方法所需的信息,例如(没有错误处理且相当粗糙)
public class C : A.B
{
    public void MyCMethod()
    {
        Type parent = GetType().BaseType;
        Type outer = parent.DeclaringType;
        System.Reflection.MethodInfo mi = outer.GetMethod("MyAMethod");
        mi.Invoke(null, null);
        return;
    }
}

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


(*), c#编译器只在http://msdn.microsoft.com/en-us/library/ms228593.aspx

中指定的情况下才这样做。

3.7范围

名称的作用域是程序文本的区域,在该区域内可以引用由名称声明的实体而不需要名称的限制[…]

—由class-member-declaration(§10.1.6)声明的成员的作用域是发生该声明的class-body。此外,类成员的作用域扩展到成员的可访问域(§3.5.2)中包含的那些派生类的类体。

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

只管做

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

方法是静态的,你可以从任何地方通过类A调用它

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

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

A.MyAMethod();就可以了

你不能直接调用MyAMethod(),因为它不属于class B,而你继承的是类B;相反,它是class A的静态成员,因此在调用A.MyAMethod();

之前必须对其进行限定。

如果你继承了class 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(); 
    }
}