using  in generic delegates?
If done cleverly, you can get away with a single method to get the input of any type:

static T GetInput&lt;T&gt;(string message, Converter&lt;string, T&gt; transform)
{
    Console.WriteLine(message);
    return transform(Console.ReadLine());
}


All you need to do is pass in a transformation function (the Converter&lt;TInput,TOutput&gt; delegate is equivalent to Func&lt;T,TResult&gt;):

int parsedInt = GetInput("Type in a number", int.Parse);
float parsedFloat = GetInput("Type in a float", float.Parse);


And ta-da, you've got your input, parsed as the desired type.

But as you also noted in the second half of your question, it's dangerous to assume that the input will always be valid. There's a universal version of your insist-on-valid-input function too. However, you should avoid using exceptions for normal control flow. Use the xxx.TryParse methods instead.

First, define the following delegate that matches the TryParse method defined in all the primitive types:

delegate bool TryParse&lt;T&gt;(string input, out T output);


Then, you can implement the loop:

static T InsistOnValidInput&lt;T&gt;(string message, string errorMessage, TryParse&lt;T&gt; validator)
{
    Console.WriteLine(message);
    T result;
    while (!validator(Console.ReadLine(), out result))
    {
        Console.WriteLine(errorMessage);
    }
    return result;
}


And call it:

bool parsedBool = InsistOnValidInput&lt;bool&gt;("Type in a bool", "Try again", bool.TryParse);


Unfortunately, C# doesn't infer the type parameter of the output argument, so you need to specify it manually (in this case, &lt;bool&gt;).