让我说我有,
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。
答案 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();
}
}