Если вы не застряли в словаре и хотите установить взаимно-однозначное соотношение между типом и функцией, вы можете использовать общие статические переменные для хранения и извлечения функций и обеспечения безопасности типов в процессе.
"Магия" происходит в StringInternal<T>
. Поскольку StringInternal<string>.Stringify
- это переменная, отличная от StringInternal<float>.Stringify
, вы можете сохранить Func в этой статической переменной и получить к ней доступ, используя тип.
Класс Stringifier
- это неуниверсальный класс с универсальными функциями, так что мы можем использовать вывод типов, упрощая наш синтаксис вызова.
public static class Stringifier
{
public static void Set<T>(Func<T, string> func)
{
StringifierInternal<T>.Stringify = func;
}
public static string Stringify<T>(T value)
{
return StringifierInternal<T>.Stringify(value);
}
private static class StringifierInternal<T>
{
public static Func<T, string> Stringify { get; set; }
}
}
Использование:
Stringifier.Set<string>(v => v + "stringified");
Stringifier.Set<float>(v => v.ToString() + "floatstringified");
Stringifier.Set<bool>(v => v ? "it's twoo" : "not twoo");
Console.WriteLine(Stringifier.Stringify("X"));
Console.WriteLine(Stringifier.Stringify((float)17));
Console.WriteLine(Stringifier.Stringify(true));
Выход:
Xstringified
17floatstringified
it's twoo