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

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как бороться с неинициализированными полями делегата?

Сообщение Anonymous »

В этой ситуации:

Код: Выделить всё

public class StrongHooksTest
{
[Fact]
public void NoInvocations()
{
//Hooks.TestHook += (x) => 1234;
var a = Hooks.TestHook.Invoke;
}

static class Hooks
{
public delegate int TestDelegate(int a);
public static TestDelegate TestHook;
}
}
Вызов NoInvocats() приводит к исключению ArgumentException: делегат метода экземпляра не может иметь значение null 'this'. поскольку Hooks.TestHook не был инициализирован и поэтому имеет значение NULL. (Фактическое исключение на самом деле не имеет смысла, но я понимаю)
Группы методов не могут быть обнуляемыми, поэтому Hooks.TestHook?.Invoke не работает.
Теперь вы можете спросить, зачем мне это делать?

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

Код: Выделить всё

TResult Run(Func hook, T arg);
который называется так:

Код: Выделить всё

int result = Run(Hooks.TestHook.Invoke, 1234);
Это работает, но только если в поле делегата добавлен += хотя бы один раз.
Какие варианты мне нужно сделать? иметь дело с неинициализированными полями делегата, не требуя от вызывающей стороны моей оболочки выполнения дополнительной логики (и без потери строгой типизации)?

Подробнее здесь: https://stackoverflow.com/questions/787 ... ate-fields
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»