【发布时间】:2019-12-29 12:58:59
【问题描述】:
我目前正在尝试对泛型类型进行一些转换。 所以基本思想是有一个方法接受泛型类型,并根据传入的类型做不同的事情。
为简单起见,我将仅展示float、bool 和default 的用法
设置看起来像这样(其中T 是类本身定义的泛型类型):
protected T DoStuff(T value)
{
switch (value) {
case float floatValue:
float result = DoFloatStuff(floatValue);
switch (result) {
case T output:
return output;
}
case bool boolValue:
bool result = DoBoolStuff(boolValue);
switch (result) {
case T output:
return output;
}
default:
// return value;
DoRealGenericStuff(value) // Edited, since I just want to sort out some special cases
}
}
其中 DoFloatStuff 和 DoBoolStuff 只是分别具有 1 个参数和其类型的返回类型的方法。
如果我不那样做(我之前尝试过一些typeof() 转换),编译器总是抱怨它不能从T 转换为float,反之亦然,即使我确定这会一些 Case-Switch / If-Else 语句就是这种情况。
有人知道更好的方法吗?
提前致谢, 两线
编辑:
由于很多人都说了同样的话,我要么根本不应该在这种情况下使用泛型,要么我的方法本身需要更通用。
我的问题是我需要使用第 3 方方法来处理我正在检查的特殊情况(在本例中为 float 和 bool 类型)。对于默认情况,我已经以通用方式处理了所有内容。但是对于某些已定义的类型,我就是不能这样做。
所以要更详细地说明为什么会这样:
我目前正在为“Unity Engine”开发插件。 Unity 内置了显示类型的方法(所有原始类型和一些 Unity 特定类型)。我有一个通用的 Wrapper 类,它应该能够包含任何类型。但是,当我想在 Unity Editor 提供的 GUI 中显示该包装器的内容时,我必须使用内置方法来显示原语(类似于UnityEditor.EditrGUI.FloatField())。没有这些方法,我永远无法显示任何东西。
然后可以以更通用的方式显示可以分解为这些类型的任何其他内容。
【问题讨论】:
-
如果
DoFloatStuff和DoBoolStuff如此不同以至于它们不能被“泛化”,那么你就没有使用泛型。放弃吧,拥有object DoStuff(object value)。 -
@Dialectus 如果您不知道对象的类型,那应该是唯一的选择。如果编译器可以在编译时找出类型,那么他应该使用方法重载,而不是泛型,而且绝对不是
object。
标签: c# if-statement generics casting switch-statement