Похоже, вы ищете что-то похожее на то, что вы уже делаете.В этот момент проще всего было бы сделать второй и третий параметры также общими.
public delegate bool ParseToDelegate<T,U,K>(string value, U secondOption, K thirdOption, out T result);
public static T? ParseTo<T, U, K>(this string value, U second, K third, ParseToDelegate<T,U, K> method) where T : struct
{
T result;
if (String.IsNullOrWhiteSpace(value)) return null;
if (method(value, second, third, out result)) return result;
return null;
}
Однако проблема в том, что сигнатура места вызова метода начинает становиться довольно неприятной и это в значительной степени зависит от вызывающей стороны, знающей структуру делегата и для чего вообще нужны общие параметры.
someDateString.ParseTo<DateTime, IFormatProvider, DateTimeStyles>
(CultureInfo.CurrentCulture.DateTimeFormat,
DateTimeStyles.AssumeUniversal,
DateTime.TryParse);
Чтобы немного это облегчить, вы можете просто обернуть этивызовы в вызовах с особым типом и вместо этого представляют их как методы расширения.
public static DateTime? ParseToDateTime(this string value, IFormatProvider provider, DateTimeStyles style)
{
return ParseTo<DateTime, IFormatProvider, DateTimeStyles>(value, provider, style, DateTime.TryParse);
}
Это облегчит вызов вызывающему, но основополагающие интуиции могут все еще быть немного запутанными и должны определенно документироваться.хорошо.
someDateString.ParseToDateTime(CultureInfo.CurrentCulture.DateTimeFormat,
DateTimeStyles.AssumeUniversal);