Если вы хотите полагаться на разрешение перегрузки для среды выполнения, чтобы решить, какой метод вызывать, то у вас должен быть отдельный метод для каждого типа, который вы будете поддерживать. Вот как это работает.
С другой стороны, если вы можете позволить пользователю предоставлять хотя бы небольшую информацию о типах, мы можем немного улучшить ситуацию с помощью шаблонов, удалив try/catch
и использовав реальный * 1004. * заявление. Вы бы назвали это так:
var myNumber = ReadFromKeyboard<double>("Enter a double: ");
И код будет выглядеть так:
public static T ReadFromKeyboard<T>(string label, int maxRetries = int.MaxValue)
{
while (maxRetries >= 0)
{
Console.Write(label);
if (typeof(T) == typeof(int))
{
int result;
if (int.TryParse(Console.ReadLine(), out result)) return (T)(object)result;
}
if (typeof(T) == typeof(float))
{
float result;
if (float.TryParse(Console.ReadLine(), out result)) return (T)(object)result;
}
else if (typeof(T) == typeof(double))
{
double result;
if (double.TryParse(Console.ReadLine(), out result)) return (T)(object)result;
}
else if (typeof(T) == typeof(decimal))
{
decimal result;
if (decimal.TryParse(Console.ReadLine(), out result)) return (T)(object)result;
}
else
throw new InvalidOperationException("Unsupported type");
maxRetries--;
}
throw new InvalidOperationException("Too many bad inputs");
}
Но для того, чтобы он заработал, вам нужно выполнить несколько очень дурацких приведений и проверок типов , Существует вероятность того, что это может вызвать исключение, которое, по-видимому, вы хотите избежать, но если ваш пользователь сидит там более 2 миллиардов попыток, я сомневаюсь, что они будут очень удивлены.