2015-04-08 2 views
2

Предположим, я пытаюсь написать метод обертки вокруг существующего статического метода. Давайте возьмем консоль, например.Автоматически наследовать все сигнатуры методов при написании вспомогательного метода? (C#)

public static void WriteWithPrefix(string prefix, ...) 
{ 
    Console.Write(prefix); 
    Console.Write(" - "); 
    // Console.Write(...) 

} 

Console.Write метод имеет что-то вроде 18 подписей, охватывающих весь диапазон примитивных типов, а также тиражирование методы string.Format.

Есть ли способ написать этот вспомогательный класс, чтобы он мог также принимать любые типы данных, которые обычно принимают Console.Write?

Другой пример:

public static void WriteWithTimestamp(...) 
{ 
    Console.Write(DateTime.Now.ToString()); 
    Console.Write(": "); 
    // Console.Write(...) 
} 

Когда я называю WriteWithTimestamp метод, который я хочу, чтобы иметь возможность передать ему что-нибудь, что я мог бы также дать в Console.Write ...

+0

Наследовать от TextWriter, так что вы получите все эти перегрузки бесплатно. –

ответ

1

Чтобы сделать это в нормальном режиме , вам нужно будет перегрузить для каждой из Console.Write перегруженных функций, что означает несколько перегрузок вашего метода.

Однако, вы можете использовать dynamic в качестве альтернативного подхода для достижения ваших целей:

public static void WriteWithTimestamp(dynamic value) 
{ 
    Console.Write(DateTime.Now.ToString()); 
    Console.Write(": "); 
    Console.Write(value); 
} 

dynamic Использование заставит его оценить и использовать наиболее подходящие перегрузки во время выполнения. Поскольку Console.Write имеет перегрузку, которая принимает в качестве параметра object, это также не должно вызывать исключения.

+0

Это прекрасно! благодаря – fdmillion

0

Вам необходимо перегрузить ваш метод и записать столько подписей, сколько у Console.Write() имеет те же типы параметров, которые принимаются Console.Write() Или вы можете написать один метод со всей консолью параметры .WRITE в набор обнулить или до некоторого значения, как это:

public static void WriteWithTimestamp(string text = null, DateTime date = null, ...) 
{ 
    Console.Write(DateTime.Now.ToString()); 
    Console.Write(": "); 
    // Console.Write(...) 
} 

Теперь вы можете выбрать, какие параметры передать в метод, не перегружать его.

Edit: Использование dynamic это лучший подход, понятия не имел, он существовал :-)

0

В случае Вашего конкретного примера, я бы просто выставить метод WriteWithTimestamp(string), и оставить его до вызывающей для преобразования их параметров в строку с использованием вызовов ToString или String.Format.

Однако, предполагая, что вы имели в виду, чтобы задать вопрос, как правило, я бы предложил принимать в params object[] массив, и передать его на вызов вашего статического метода решены путем отражения:

public static void Main(string[] args) 
{ 
    Console.WriteLine("Location is ({0},{1})", 4, 7); 
    WriteWithTimestamp("Location is ({0},{1})", 4, 7); 
} 

public static void WriteWithTimestamp(params object[] parameters) 
{ 
    Console.Write(DateTime.Now.ToString()); 
    Console.Write(": "); 

    var parameterTypes = parameters.Select(p => p.GetType()).ToArray(); 
    var writeLine = typeof(Console).GetMethod("WriteLine", parameterTypes); 
    writeLine.Invoke(null, parameters); 
}