2009-11-19 2 views
1

У меня есть follwing структура класса:Вызвать метод производного класса через отражение. Возможно или нет?

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 = новые ClassThatUses {Foo = новый бар(); }

Как-то в ClassThatUses мне нужно позвонить (через отражение - обязательно) Подготовить метод класса 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. Мне нужно узнать тип назначенного поля REAL, а затем ввести его.

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

p.s. я понимаю, что без отражения это будет называться - не проблема. это скорее теория.

UPD: http://msdn.microsoft.com/en-us/library/a89hcwhh.aspx Обратите внимание, что вы не можете использовать объект MethodInfo из базового класса для вызова переопределенного метода в производном классе, поскольку поздняя привязка не может разрешить переопределения. Означает ли это, что проблема неразрешима?

ответ

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(); 
+0

Большое вам спасибо! вот что мне нужно! – 0100110010101

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

или

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

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

Да, с foo.GetType()

+0

Возможно, я должен уточнить его более точно. Я не знаю, это Bar, BarBar или BarBarBar. Мне нужно узнать тип назначенного поля REAL, а затем ввести его. – 0100110010101

+0

GetType даст вам «настоящий» тип. – Guillaume

+0

да, но когда я иду ClassThatUses.GetType.GetProperties() -> то попробуйте получить Foo, он говорит, что это тип Foo, а не Bar. – 0100110010101