我有一个以下类结构:
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对象来调用派生类中的重写方法,因为后期绑定无法解析覆盖。 这是否意味着问题无法解决?
答案 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()