我想访问base classe中的派生类成员:
class Program
{
static void Main(string[] args)
{
B b = new B();
b.FieldTest = 5;
b.MethodeTest();
}
}
public class A
{
public void MethodeTest()
{
//will return B
Type t = this.GetType();
Console.WriteLine(t);
var temp = ???.FieldTest;
//i want that these return 5
Console.WriteLine(temp);
Console.ReadLine();
}
}
public class B:A
{
public int FieldTest;
}
我不确定这些是否可行,但我希望你有任何想法来解决它。
谢谢
答案 0 :(得分:6)
嗯,可以使用动态输入执行此操作:
dynamic dynamicThis = this;
var temp = dynamicThis.FieldTest;
......但这是一个非常奇怪的要求。如果this
实际上只是 A
的一个实例,或者实际上是没有这样一个成员的不同子类的实例,您会发生什么?基本上这是一个狡猾的设计。
目前尚不清楚您要实现的目标,但您可能希望将A
作为抽象类,并使用 abstract 属性,所有子类都可以实行。 (注意,你不能把字段抽象......)
如果这没有帮助,请首先详细说明您尝试这样做的原因。
答案 1 :(得分:1)
你不能通过你的榜样来展示它。基类对派生类的实现一无所知。
但是,你可以做的是在基类中定义一个虚方法或属性,它可以在派生类中实现,并返回所需的值(模板方法模式):
public class A
{
protected virtual int FieldTest { get { return 0; } }
public void TestMethod()
{
Console.WriteLine ("FieldTest: " + FieldTest);
}
}
public class B : A
{
protected override int FieldTest { get { return 5; } }
}
public class C : A
{
protected override int FieldTest { get { return 10; } }
}
答案 2 :(得分:1)
基类无权访问派生类的字段。需要这样做可能是一个应用程序结构错误。
答案 3 :(得分:0)
使您的方法成为虚拟,并在派生类中覆盖它。您可以调用方法的基类实现,但也可以添加特定于派生类的新行为:
public class A
{
public virtual void MethodeTest()
{
//will return B
Type t = this.GetType();
Console.WriteLine(t);
Console.ReadLine();
}
}
public class B:A
{
public int FieldTest;
public override void MethodeTest()
{
base.MethodeTest(); // base class implementation
Console.WriteLine(FieldTest); // FieldTest is available here
Console.ReadLine();
}
}
答案 4 :(得分:0)
除非每个A
都有FieldTest
属性,否则如果A
实际上不是B
,则无法执行此操作。
var b = a as B;
if (b != null)
{
b.FieldTest;
}
答案 5 :(得分:0)
您不必从基类访问派生类成员。相反,您的设计应该允许更多派生类型提供实现,然后调用基类。或者,如果调用是在多个派生类型之间共享的,那么逻辑应该属于基类。
因为您似乎需要使用单个方法执行调用,所以正常覆盖应该起作用。一个人为的例子,
class Animal
{
public virtual bool Speak() { //return true. Assume all animals make a sound }
}
class Dog : Animal
{
public override bool Speak() { //Bark and return base.Speak() }
}
现在,如果Dog定义Eat()
,Animal不应该执行derived.Eat
。相反,Eat应该在Animal中定义并由派生类调用。
答案 6 :(得分:0)
感谢您的回复! 我试过这个解决方案并且效果很好
public void MethodeTest()
{
//will return B
Type t = this.GetType();
Console.WriteLine(t);
foreach (FieldInfo fieldInfo in t.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
{
Console.WriteLine("{0}\t{1}:{2}", fieldInfo.FieldType.Name, fieldInfo.Name, fieldInfo.GetValue(this));
}
Console.ReadLine();
}