Delegates: Как получить, имея следующее ...
От: sing  
Дата: 23.12.03 12:19
Оценка:
Столкнулся с бедой следующего рода.

Имею MethodInfo метода и ссылку на экземпляр класса этого метода. Хочу в runtime получить делегат. Вроде все есть для этого, но ...

Вот тип делегата
public delegate object ExecDelegate(object name, object param);


Вот кусок кода класса


public class Sample {

// ...

object ExecCommon(object name, object param) {
 //...
}

object ExecParticular(object name, string param) {
 //...
}

}


Хочу получить делегат ExecDelegate для ExecParticular. Если прямо в коде прописать, то проблем нет, а в рантайме
. Delegate.CreateDelegate()с параметром MethodInfo работает только для статических методов

Как быть?
Re: Delegates: Как получить, имея следующее ...
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.12.03 12:24
Оценка:
Здравствуйте, sing, Вы писали:

S>Столкнулся с бедой следующего рода.


S>Имею MethodInfo метода и ссылку на экземпляр класса этого метода. Хочу в runtime получить делегат. Вроде все есть для этого, но ...


S>Вот тип делегата

S>
S>public delegate object ExecDelegate(object name, object param);
S>


S>Вот кусок кода класса


S>

S>public class Sample {

S>// ...

S>object ExecCommon(object name, object param) {
S> //...
S>}

S>object ExecParticular(object name, string param) {
S> //...
S>}

S>}
S>


S>Хочу получить делегат ExecDelegate для ExecParticular. Если прямо в коде прописать, то проблем нет, а в рантайме

S> . Delegate.CreateDelegate()с параметром MethodInfo работает только для статических методов

S>Как быть?


http://www.rsdn.ru/Forum/Message.aspx?mid=408345&only=1
Автор: Serginio1
Дата: 13.10.03
и солнце б утром не вставало, когда бы не было меня
Re[2]: Delegates: Как получить, имея следующее ...
От: sing  
Дата: 23.12.03 12:36
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>http://www.rsdn.ru/Forum/Message.aspx?mid=408345&only=1
Автор: Serginio1
Дата: 13.10.03


Спасибо, но проблема в другом.
Нет метода CreateDelegate с параметром MethodInfo для нестатического метода. Просто по имени метода создать делегат не получится, потому как у меня несколько методов с одинаковыми именами типа
object ExecParticular(string name, object param)
object ExecParticular(string name, string param)
object ExecParticular(string name, Delegate param)

а сигнатура делегата объявлена как object(object, object)
вот руками к такому типу привести не проблема, но в рантайме только по MethodInfo и ref holderObject не могу
Re[3]: Delegates: Как получить, имея следующее ...
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.12.03 12:55
Оценка: -1
Здравствуйте, sing, Вы писали:

S>Здравствуйте, Serginio1, Вы писали:


S>>http://www.rsdn.ru/Forum/Message.aspx?mid=408345&only=1
Автор: Serginio1
Дата: 13.10.03


S>Спасибо, но проблема в другом.

S>Нет метода CreateDelegate с параметром MethodInfo для нестатического метода. Просто по имени метода создать делегат не получится, потому как у меня несколько методов с одинаковыми именами типа
S>
S>object ExecParticular(string name, object param)
S>object ExecParticular(string name, string param)
S>object ExecParticular(string name, Delegate param)
S>

S>а сигнатура делегата объявлена как object(object, object)
S>вот руками к такому типу привести не проблема, но в рантайме только по MethodInfo и ref holderObject не могу
Создай 3 делегата. Пойми если ты хочешь использовать некий общий делегат и вызов через DinamicInvoke, то от отображения ты не уйдешь, только типизация тебя спасет.
А если ты читал более досконально, то в делегате уже заложены все типы параметров и будет для него выдаваться адресс нужной функции
SetInt d3=(SetInt) Delegate.CreateDelegate(typeof(SetInt),val,"set_MyValue");
typeof(SetInt) !!!!!

Либо создай три функции с одинаковыми параметрами но с разными именами.
Суть в том, что делегату нужны только параметры и адресс функции (и ссылка на объект для объектных методов), что бы нужное загнать в стек и вызвать Call
и солнце б утром не вставало, когда бы не было меня
Re: Delegates: Как получить, имея следующее ...
От: mikа Stock#
Дата: 23.12.03 13:08
Оценка: -1
Здравствуйте, sing, Вы писали:

S>Как быть?


Использовать перегруженную ф-ию CreateDelegate, которая создает делегат по инстанс члену класса. Например,

public static Delegate CreateDelegate(
   Type type,
   object target,
   string method
);
Re[3]: Delegates: Как получить, имея следующее ...
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.12.03 13:31
Оценка:
Здравствуйте, sing, Вы писали:

S>Здравствуйте, Serginio1, Вы писали:


S>>http://www.rsdn.ru/Forum/Message.aspx?mid=408345&only=1
Автор: Serginio1
Дата: 13.10.03


S>Спасибо, но проблема в другом.

S>Нет метода CreateDelegate с параметром MethodInfo для нестатического метода. Просто по имени метода создать делегат не получится, потому как у меня несколько методов с одинаковыми именами типа

Почему есть
Вызывай public static Delegate CreateDelegate(Type type, MethodInfo method)
и подменяй соответствующие поля.
http://www.rsdn.ru/Forum/Message.aspx?mid=475911&only=1
Автор: Dax
Дата: 11.12.03
и солнце б утром не вставало, когда бы не было меня
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.