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

时间:2011-12-01 09:14:03

标签: 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。

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

6 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

如果您查看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节)声明的成员范围是声明发生的类体。此外,类成员的范围扩展到成员的可访问性域(第3.5.2节)中包含的派生类的类主体。

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

答案 2 :(得分:1)

简单地做

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

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

答案 3 :(得分:0)

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

此致

答案 4 :(得分:0)

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

A.MyAMethod();会做的。

答案 5 :(得分:0)

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

如果您继承了class A,那么您的代码就可以了,因为C类也将继承该方法。

OR

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

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(); 
    }
}