Как принять ЛЮБОГО делегата в качестве параметра

Необходимо также рассмотреть array модуль в стандартной библиотеке, если все объекты в списке или кортеже имеют тот же тип C. Это возьмет меньше памяти и может быть быстрее.

10
задан Donald Byrd 9 December 2009 в 20:19
поделиться

2 ответа

bool DoesItThrowException(Action a)
{
  try
  {
    a();
    return false;
  }  
  catch
  {
    return true;
  }
}

DoesItThrowException(delegate { desomething(); });

//or

DoesItThrowException(() => desomething());
3
ответ дан 3 December 2019 в 22:37
поделиться

Вы не можете вызвать его, пока не укажете аргументы; и вы не можете привести аргументы, если не знаете подписи. Чтобы обойти это, я бы возложил эту нагрузку на вызывающего абонента - я бы использовал Action и anon-methods / lambdas, то есть

DoesItThrowException(FirstMethod); // no args, "as is"
DoesItThrowException(() => SecondMethod(arg)); 
DoesItThrowException(() => ThirdMethod(arg1, arg2, arg3, arg4, arg5));

В противном случае вы можете использовать Delegate и ] DynamicInvoke , но это медленно, и вам нужно знать, какие аргументы его передать.

public static bool DoesItThrowException(Action action) {
    if (action == null) throw new ArgumentNullException("action");
    try {
        action();
        return false;
    } catch {
        return true;
    }
}
12
ответ дан 3 December 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: