如何重构方法

0 .net c# refactoring

我有两种方法。它们非常相似。我尝试使用泛型,但不适用于TryParse()

    public static int EnterIntengerNumber()
    {
        while (true)
        {
            Console.Write("Enter an intenger number: ");
            if (int.TryParse(Console.ReadLine(), out int number))
            {
                return number;
            }
            else
            {
                ConsoleError("Incorrect value");
            }
        }
    }


    public static double EnterRealNumber()
    {
        while (true)
        {                
            Console.Write("Enter a number: ");
            if (double.TryParse(Console.ReadLine(), out double number))
            {
                return number;                    
            }
            else
            {
                ConsoleError("Incorrect value");
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

如何合并或重构它们?

Mal*_*ior 5

您可以创建函数,该函数接受带有TryParse参数的委托并返回通用值。另外,您可以/必须输入字符串以询问正确的类型。但这可以通过以下示例进行改进:

    static void Main(string[] args)
    {
        var myDouble = EnterSomething<double>("a double", double.TryParse);
        var myInt = EnterSomething<int>("an interger", int.TryParse);
        Console.WriteLine(myDouble);
        Console.WriteLine(myInt);

        Console.ReadLine();
    }


    public delegate bool TryParseFunction<Tout>(string input, out Tout output);

    public static Tout EnterSomething<Tout>(string typeName, TryParseFunction<Tout> parser)
    {
        while (true)
        {
            Console.Write("Enter " + typeName + " number: ");
            if (parser(Console.ReadLine(), out Tout number))
            {
                return number;
            }
            else
            {
                Console.WriteLine("Incorrect value");
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

小小的附加说明:int.TryParse-传递给EnterSomething的方法不是调用TryParse。实际上,它只是“传递”函数,以便可以在EnterSomething中调用它。

不使用的原因Func<>是它不支持out变量,请参见此处的示例:带有out参数的Func <T>

编辑:我删除了Tin类型的参数,因为无论如何输入都是字符串。