Вызвать метод производного класса через отражение. Возможно или нет? - PullRequest
1 голос
/ 19 ноября 2009

У меня есть следующая структура класса:

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 из базового класса для вызова переопределенного метода в производном классе, поскольку позднее связывание не может разрешить переопределения. Значит ли это, что проблема неразрешима?

Ответы [ 2 ]

4 голосов
/ 19 ноября 2009

Метод 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();
0 голосов
/ 19 ноября 2009
typeof(Bar).GetMethod("Prepare").Invoke(foo, new object[] { });

или

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

возможно ли это узнать реальный тип поля Foo в во время выполнения?

Да, с помощью foo.GetType ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...