如何将类型转换为泛型类型,其实际类型在转换时已知?

问题描述 投票:0回答:1

我有一组方法,它们只是将存储的“对象”返回为不同的类型,如下所示:

bool GetAsBool();
string GetAsString();
int GetAsInt();

在实际场景中,目前有 16 个,而且方法名称有点长,读起来不太好。我现在希望通过定义一个通用方法来使其更加方便,该方法从这组“Get”方法中选择正确的方法。这将为通过泛型传递的类型提供语法突出显示,并使名称更短,我觉得最终更容易阅读。但我不知道如何进行类型转换。

通用方法目前看起来像这样:

T Get<T>()
{
    var returnTpe = typeof(T);
    if (returnType == typeof(bool) { return GetAsBool(); }
    else if (returnType == typeof(string) { return GetAsString(); }
    else if (returnType == typeof(int) { return GetAsInt(); }
    else { return default; }
}

这给了我

Cannot implicitly convert type 'bool' to 'T'
(对于布尔值,其他类型类似)。但当我到达那里时,从 if 子句中我确实知道 T 是什么类型。因此“T”的类型和我选择的方法的返回类型始终匹配。这应该意味着转换总是可能的,对吧?如何将输入的结果转换回 T?

到目前为止,我只通过

return (T)GetAsBool()
尝试了一个简单的转换,这给了我
Cannot convert type 'bool' to 'T'
。我不是类型或泛型方面的专家,谷歌搜索也没有给我带来更多的想法。我想做的事情可能吗?

c# .net types casting
1个回答
0
投票

要得到你想要的东西,你可以双重投射,首先到

object
,然后到
T
,它会编译。

if (returnType == typeof(bool) { return (T)(object)GetAsBool(); }

但是如果您确实想要简短的语法,我建议完全放弃

Get
方法并定义转换运算符。

static public explicit operator bool(MyClass source) => GetAsBool();
static public explicit operator string(MyClass source) => GetAsString();

然后使用你的类的人可以将其转换为他们想要的类型,如果不支持转换,则会出现编译时错误。

var x = (bool)myObject;
var y = (string)myObject;
© www.soinside.com 2019 - 2024. All rights reserved.