2013-04-22 3 views
1

Я пытаюсь скрыть сложности в функциях, чтобы упростить вызов функций. Например, функция Log(string msg) для ввода текстовых сообщений в элемент управления текстовыми полями, с новой строкой и Invoke() для многопоточности. Теперь я хочу избежать использования Log(string.Format("..{0}..", x, ...)) и написал версию Log(string format, params object[] args), которая отлично работает.Функция передачи C# с переменным списком аргументов в качестве аргумента

Пока мне не нужно, чтобы пройти этот LOG() в качестве аргумента другой функции, которую необходимо сделать каротаж:

AnotherFunction(Action<string, object[]> Log) 
{ 
    Log("formatstring", new object[] { value1, value2, ...}); 
} 

Мой вопрос: как я могу избежать необходимости в код new object[] строительства каждый раз, когда я должен Журнал вызовов()?

+0

Я не верю, что можно, и это произошло бы в любом случае (массив создается из Params аргумента). Ваш единственный реальный вариант - иметь несколько перегрузок с различным количеством аргументов. –

+0

Для этого нужно было бы определить тип Action , но ключевое слово 'params' доступно только в списках параметров функций, поэтому использование определения делегата, по-видимому, является единственным вариантом если вам нужен синтаксический сахар для переменной длины списка параметров. –

+0

@JonnyDee: вместо синтаксического сахара я предпочитаю видеть делегатов как новый уровень сложности. С C это было бы проще. Возможно, менее сильный ввод текста, но, для меня, проще понять синтаксис. – Roland

ответ

4

Я согласен с тем, что интерфейс будет самым чистым решением. Если это не вариант, однако, вы всегда можете создать свой собственный делегат, который использует params:

public delegate void FormattingLoggerDelegate(string format, 
               params object[] args); 

AnotherFunction будет выглядеть следующим образом:

public void AnotherFunction(FormattingLoggerDelegate log) 
{ 
    log("formatstring", value1, value2); 
} 

Usage будет прозрачным, т.е. нет необходимости, чтобы бросить вашему делегату. Так же, как с Action неявное приведение существует:

AnotherFunction(Log); 

Demo

+0

Обратите внимание, что это все равно будет создавать массив объектов (автоматически, хотя). –

+0

Конечно, параметр представляет собой массив, поэтому, естественно, в какой-то момент нужно создать. Вопрос о OP заключается в том, чтобы избежать необходимости * * генерировать создание массива вручную. –

+0

Я думаю, что это можно прочитать двумя способами, скорее всего, это ваша интерпретация, во-вторых, он вообще не хочет создания массива. –

1

Интерфейс был бы чище. Вы также можете рассмотреть возможность использования существующей структуры ведения журнала (например, log4net или NLog) и реализовать цель (или использовать существующую), которая записывает вывод в текстовое поле.

Смежные вопросы