У меня есть следующая структура класса:
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, а не 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)
Я не знаю, бар это, или BarBar, или BarBarBar. Мне нужно выяснить РЕАЛЬНЫЙ тип назначенного поля, а не тип, к которому оно было приведено.
Возможно ли это?
Или, по крайней мере, можно узнать реальный тип поля Foo во время выполнения?
p.s. я понимаю, что без размышления это будет называться - без проблем. это больше теория.
UPD: http://msdn.microsoft.com/en-us/library/a89hcwhh.aspx
Обратите внимание, что вы не можете использовать объект MethodInfo из базового класса для вызова переопределенного метода в производном классе, поскольку позднее связывание не может разрешить переопределения.
Значит ли это, что проблема неразрешима?