I'm not saying I like this but you could reuse the longest overload for the shorter ones. Here I took the one that takes three parameters. public static string PatternReplace( this string seed, string pattern, Func<string, string> outPattern ) { return seed.PatternReplace(pattern, (x, y, z) => outPattern(x)); } public static string PatternReplace( this string seed, string pattern, Func<string, string, string> outPattern ) { return seed.PatternReplace(pattern, (x, y, z) => outPattern(x, y)); }