Как передать прототип делегата в метод? - PullRequest
2 голосов
/ 01 апреля 2010

Так скажем, у меня в классе:

public delegate bool MyFunc(int param);

Как я могу это сделать

someObj.PassMeADelegateToExamine(this.MyFunc); // not possible!?!

ТАК, что я могу проверить делегата и, возможно, использовать рефлексию или что-то вроде idk, чтобы узнать его тип возвращаемого значения и любые параметры, которые он может иметь?

В принципе, если я смогу превратить его в (не вызываемый) объект действия, который будет великим

Ответы [ 2 ]

2 голосов
/ 01 апреля 2010

«Прототип» - это просто новое определение типа - это не фактический экземпляр, который вы бы использовали напрямую. В вашем случае MyFunc является делегатом Type, а не фактическим делегатом.

Вы можете сделать:

void PassMeADelegateTypeToExamine(Type type) { ... }

А потом назовите это:

someObj.PassMeADelegateTypeToExamine(MyFunc);
0 голосов
/ 01 апреля 2010

Объявление делегата - это объявление типа, как struct и class. Так что вы можете использовать

typeof(MyFunc)

Чтобы найти тип и аргументы делегата, вы должны посмотреть на метод Invoke типа делегата:

MethodInfo invokeMethod = typeof(MyFunc).GetMethod("Invoke");
Type returnType = invokeMethod.ReturnType;
ParameterInfo[] parameterInfos = invokeMethod.GetParameters();

Делегат - это в значительной степени класс с некоторыми обычными методами, такими как Invoke. Когда вы используете экземпляр делегата, как это

func(args)

Это внутренне переведено на

func.Invoke(args)

Именно поэтому в пространстве имен отражения нет специального типа DelegateInfo : метод Invoke MethodInfo сообщает вам все, что вам нужно.

Теперь, если вы хотите динамически вызывать экземпляр делегата, вы можете либо использовать рефлексию и вызвать Invoke в своем MethodInfo , либо убедиться, что ваша переменная делегата имеет тип Delegate , который дает вам доступ к методу DynamicInvoke:

Delegate func = ...;
object result = func.DynamicInvoke(arg1, arg2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...