通过反射调用派生类的方法。可能还是不?

时间:2009-11-19 10:28:48

标签: c# reflection

我有一个以下类结构:

public abstract class AbstractFoo
{
    public virtual void Prepare()
    {
    }
}
public class Foo : AbstractFoo
{
    public override void Prepare()
    {
    }
}

public class Bar : Foo
{
    public override void Prepare()
    {
    }
}

public class ClassThatUses
{
    public Foo Foo;
}

var classThatUsesInstance = new ClassThatUses {Foo = new Bar(); }

以某种方式在ClassThatUses我需要调用(通过反射 - 强制)类Bar的Prepare方法。

而不是问题(???)标记我需要制作一个反射代码,它将调用Bar的Prepare方法而不是foo。

基本上,它应该是这样的:

classThatUsesInstance.GetType.GetProperties()[0] 
-> somehow understand that it's actually Bar, but not Foo. 
-> call method (which i know how to do, i just need the RIGHT method to be used)

我不知道它是Bar,BarBar还是BarBarBar。我需要找出指定字段的REAL类型,而不是输入它的类型。

这有可能吗? 或者至少可以在运行时找出Foo字段的真实类型吗?

P.S。我意识到没有反思就会被称为 - 没问题。这更像是一种理论。

UPD:http://msdn.microsoft.com/en-us/library/a89hcwhh.aspx 请注意,您不能使用基类中的MethodInfo对象来调用派生类中的重写方法,因为后期绑定无法解析覆盖。 这是否意味着问题无法解决?

2 个答案:

答案 0 :(得分:4)

GetType方法将在运行时为您提供真实类型的Foo

public class ClassThatUses
{
    public Foo Foo { get; set; }

    public void CallPrepare()
    {
        // Foo.Prepare();
        Foo.GetType().GetMethod("Prepare").Invoke(Foo, null);
    }
}

在您进行编辑之后,如果您想为Foo的特定实例找到ClassThatUses的运行时类型,那么您需要使用GetValue来查询值该实例的Foo

ClassThatUses o = new ClassThatUses() { Foo = new Bar() };

// Type fooType = o.Foo.GetType();
Type fooType = o.GetType().GetProperty("Foo").GetValue(o, null).GetType();

答案 1 :(得分:0)

typeof(Bar).GetMethod("Prepare").Invoke(foo, new object[] { });

foo.GetType().GetMethod("Prepare").Invoke(foo, new object[] { });
  

至少有可能找到答案   中的Foo字段的真实类型   运行

是的,使用foo.GetType()