Доступ к аргументам функции (и их именам) во время вызова? - PullRequest
0 голосов
/ 29 февраля 2020

У меня около 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 будут быстрыми).

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...