从子继承类中获取父类的静态成员
本文关键字:父类 静态成员 获取 继承 | 更新日期: 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();
}
}