Как бороться с неинициализированными полями делегата?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

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