首页 > 解决方案 > 从泛型类型调用方法

问题描述

我将创建一个方法来解析来自控制台应用程序的输入并在TryParse通过时返回值,否则继续询问。我将对 acharint变量使用相同的方法。正因为如此,我写了这个方法。

int a = GetInput<int>("a");
char operation = GetInput<char>("operation");
int b = GetInput<int>("b");

private static TResult GetInput<TResult>(string variable)
{
    Console.Write($"Enter {variable}: ");

    if (TResult.TryParse(Console.ReadLine(), out TResult input)) 
//              ^^^^^^^^
    {
        return input;
    }

    Console.WriteLine("Invalid input.");
    return ReadInteger<TResult>(variable);
}

但是我在调​​用的行上遇到了这个错误TryParse

TResult是一个类型参数,在给定的上下文中是无效的

我怎么能解决这个问题?我知道TResult没有方法TryParse,但我不知道如何让编译器相信总会有一个TryParse. 我可以用模式匹配解决这个问题吗?

PS:我正在制作 C#8 的演示,所以欢迎使用 C#8。

标签: c#genericsc#-7.0c#-8.0

解决方案


目前,如果不使用反射,就无法做到这一点。将来,C#可能会引入一种约束类型参数的方式,即它们所具有的运算符、静态方法和构造函数 - 但 C# 8 预览版中没有任何内容(我不希望它会在 C# 中引入) 8)。


推荐阅读