Создать тип делегата C # с параметром ref во время выполнения - PullRequest
2 голосов
/ 06 апреля 2011

Мне нужно создать тип делегата с параметром ref во время выполнения.

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

// S is some struct / value type, e.g. int or Guid
delegate void VoidDelSRef (ref S s);
Type td = typeof (VoidDelSRef);

Этот тип td используется для создания дерева выражений C # 4, которое компилируется в делегат.

Поскольку код в моем дереве выражений изменяет параметр s, мне нужно передать s по ссылке.

Я должен поддерживать любой тип S, поэтому я не могу использовать явное объявление типа делегата, потому что у меня есть только Type ts = typeof (S) и его ref тип Type tsr = ts.MakeByRefType ().

Я пытался использовать Expression.GetActionType (tsr), но он не допускает ref типов.

Как мне создать делегата с ref параметрами во время выполнения?

1 Ответ

2 голосов
/ 06 апреля 2011

В .NET 4 вы можете использовать метод Expression.GetDelegateType. В отличие от GetActionType, он отлично работает с ByRef типами.

например:.

// void MyDelegate(ref int arg)
var delType = Expression.GetDelegateType(typeof(int).MakeByRefType(), 
                                         typeof(void));

Если вы используете .NET 3.5, этот метод недоступен. Я рекомендую взглянуть на его реализацию (с декомпилятором), если вы хотите повторить его функциональность. У него не слишком много зависимостей; это определенно выполнимо.

...