2012-06-28 7 views
0

Я пытаюсь сделать что-то подобное, но с отражением:отражения вызова 2 метода

var ss1= method1(param).method2(); 

Я знаю, как вызвать первый метод, но я не знаю, как вызвать вторую.

метод 1 возвращает объект

метод 2 метод GetAwaiter (в моем конкретном случае)

MethodInfo mi = typeof(type).GetMethod("method1"); 
     Type tt = typeof(type); 
     ParameterInfo[] param = mi.GetParameters(); 

     object[] param = new object[] { //some code }; 
     object mm= mi.Invoke(this, param); 
     MethodInfo mi2 = typeof(type).GetMethod("GetAwaiter"); 
     var ss1= mi2.Invoke(mm,null); 

на последнюю строку я получаю сообщение об ошибке: «объект не соответствует целевому типу»

+4

Существуют ли оба метода одного типа? В противном случае вам нужно будет использовать тип, возвращаемый первым методом, чтобы получить метод2: MethodInfo mi2 = mm.GetType(). GetMethod («GetAwaiter»); –

+0

Было бы проще, если бы вы дали определения двух методов (method1 + method2) (объявление, с параметрами возвращаемого типа) –

ответ

1

Ваш код более или менее верен, но данное исключение говорит вам, что mm - это не то, что вы думаете. Тип, возвращаемый вашим методом1, не совпадает с типом, указанным в строке .GetMethod («GetAwaiter»).

Более безопасная ставка заключается в замене типа (типа) на mm.GetType(). GetMethod («GetAwaiter»). Я подозреваю, что на самом деле будет возвращать значение null, так как mm.GetType() не похоже на то, что вы ожидаете, но не видя больше кода (в частности, что такое «тип» и где методы «method1» и «GetAwaiter» фактически объявлено), трудно дать вам гораздо больше рекомендаций.

+0

Я не могу поместить весь код, потому что он слишком велик. Действительно, mm.GetType(). GetMethod («GetAwaiter») имеет значение null – mertin

+0

Можете ли вы дать нам только подпись метода метода method1 и сообщить нам, в каком классе объявлен класс GetAwaiter? Они должны быть одного типа для работы этого кода. –

0

Существует ошибка в этой строке

MethodInfo mi2 = typeof(type).GetMethod("GetAwaiter"); 

мм объект имеет другой тип, так что вы получите исключение. Измените линию на

MethodInfo mi2 = mm.GetType().GetMethod("GetAwaiter"); 

как предлагает Тим.

Лучше использовать метод Type.InvokeMember, поскольку он короче и помогает избежать таких ошибок. Например:

object mResult = this.GetType().InvokeMember ("method1", 
    BindingFlags.InvokeMethod | BindingFlags.Instance, null, this, 
    new object[] { /* parameters here */ }); 
object awaiter = mResult.GetType().InvokeMember ("GetAwaiter", 
    BindingFlags.InvokeMethod | BindingFlags.Instance, null, mResult, null); 
Смежные вопросы