В случаях, когда код это позволяет, можно вынести основной функционал в один из методов (базовый для вас) и вызывать его из других перегрузок:
string GenerateText(string text)
{
return GenerateText(text, "Без заголовка");
}
string GenerateText(string title, string text)
{
return title + Environment.NewLine + text;
}
Можно использовать необязательные аргументы, они как раз должны хорошо подойти в случае 1-3 различающихся параметров:
string GenerateText(string title, string text = "Без заголовка")
{
return title + Environment.NewLine + text;
}
Никто не может запретить вам передавать вместо не используемых аргументов null и обрабатывать в коде:
string GenerateText(string title, string text)
{
return title + Environment.NewLine + (text ?? "Без заголовка");
}
А в случае неопределённого числа однотипных аргументов используем params:
string GenerateText(string title, params string[] text)
{
return title + Environment.NewLine + string.Join(Environment.NewLine, text);
}
Комбинируйте этот базовый набор и его должно быть вполне достаточно для аккуратного кода. И само собой, выделяйте повторяемый функционал в методы и классы для последующего повторного использования.