我有一组方法,它们只是将存储的“对象”返回为不同的类型,如下所示:
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'
。我不是类型或泛型方面的专家,谷歌搜索也没有给我带来更多的想法。我想做的事情可能吗?
要得到你想要的东西,你可以双重投射,首先到
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;