Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何根据传入的泛型类型调用某些函数_C#_Generics_.net Core - Fatal编程技术网

C# 如何根据传入的泛型类型调用某些函数

C# 如何根据传入的泛型类型调用某些函数,c#,generics,.net-core,C#,Generics,.net Core,在下面的代码中,我尝试使用一个简短的函数来获取不同类型的值。它显然抛出了一个编译错误。有人知道我怎样才能做到吗 private T Get<T>(string key) { if (typeof(T) == typeof(int)) { return this.httpContext.Session.GetInt32(key).Value; }

在下面的代码中,我尝试使用一个简短的函数来获取不同类型的值。它显然抛出了一个编译错误。有人知道我怎样才能做到吗

private T Get<T>(string key)
        {
            if (typeof(T) == typeof(int))
            {
                return this.httpContext.Session.GetInt32(key).Value;
            }

            if (typeof(T) == typeof(string))
            {
                return this.httpContext.Session.GetString(key);
            }

            return this.httpContext.Session.GetInt32(key);
        }
private T Get(字符串键)
{
if(typeof(T)=typeof(int))
{
返回此.httpContext.Session.GetInt32(key).Value;
}
if(typeof(T)=typeof(string))
{
返回此.httpContext.Session.GetString(键);
}
返回此.httpContext.Session.GetInt32(键);
}

如果返回的是未强制转换的类型,则需要在返回前强制转换:

var data = this.httpContext.Session.GetInt32(key).Value;
if (data == null || data == DBNull.Value){
   return default(T);
}
else{
   return (T)data;
}

这将适用于类类型。。。不幸的是,它不适用于int32等值类型。@KeyvanSadralodabai理论上它应该是问题的答案。我更新了答案以解决您可能遇到的问题。无法将int类型的表达式转换为T类型。这是我收到的错误消息。我想您会发现,为每种类型使用单独的函数比尝试将其插入泛型函数更简单。您最好使用一组
GetInt
GetString
等函数。它们比
Get
更容易键入,并且它们限制了可以获取的类型集(当有人调用
Get
时会发生什么情况-您唯一的真正选择是抛出异常)。通过一组固定的功能,你可以限制那些想在脚部射击自己的人可以使用子弹。。。我懂了。如果有人不想办法用泛型,我会这么做。好的。。。我确信。我将执行单独的函数。您可以直接强制转换结果。要支持值类型,必须首先强制转换到
对象
,否则编译器不会相信强制转换通常会成功。请参阅标记的副本。不过,我同意其他意见。几乎总是,如果在一个泛型方法中,您发现自己实际检查了类型参数本身,并根据该比较执行了不同的代码,那么该方法不应该是泛型的。