У меня около 50 функций, принимающих от 2 до 20 позиционных аргументов (необходим интерфейс для надстройки Excel com).
Все они выглядят примерно так:
public static string ACustomFunction(string FirstArg, object Arg2, int ThirdArg, ...)
{
try {
if(IsErrorValue(FirstArg, out string errorDescription))
return $"Error: {nameof(FirstArg)} was {errorDescription}";
if(IsErrorValue(Arg2, out rrorDescription))
return $"Error: {nameof(Arg2)} was {errorDescription}";
if(IsErrorValue(ThirdArg, out errorDescription))
return $"Error: {nameof(ThirdArg)} was {errorDescription}";
// ... Do some real work
}
catch(Exception ex){
return $"Good Excel formulas don't throw exceptions: {ex.Message}";
}
}
В итоге получается тонна кода проверки ошибок для чего-то довольно повторяющегося и формул *
И есть некоторый вспомогательный метод (AnyErrors
) l oop для аргументов, и если какой-либо из них имеет ошибку, верните соответствующее сообщение об ошибке, включая имя аргумента, который имел ошибку.
Пока что лучшее, что я могу сделать, это исчерпывающе перечислить все аргументы и их имена для каждой функции - но это выглядит как fr agile (склонен к пропускам при добавлении новых аргументов):
string anyErrors = AnyErrors(FirstArg, nameof(FirstArg), Arg2, nameof(Arg2), ThirdArg, nameof(ThirdArg), ...));
if(anyErrors != null)
return anyErrors;
public static string AnyErrors(params object[] args)
{
for (int i = 0; i < args.Length; i++)
if(IsErrorValue(args[0], out string errorDescription))
return $"Error: {nameof(args[1])} was {errorDescription}";
return null;
}
Это то, что я могу сделать более элегантно, возможно, с некоторым умным отражением? (Желательно что-то, что не влечет за собой больших потерь производительности - ожидается, что формулы Excel будут быстрыми).
Спасибо