BOT*_*ine 0 c# generics casting if-statement switch-statement
我目前正在尝试对泛型类型进行一些转换。所以基本的想法是有一个方法,它接受一个泛型类型,并根据传入的类型做不同的事情。
为简单起见,我将只展示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
}
}
Run Code Online (Sandbox Code Playgroud)
WhereDoFloatStuff和DoBoolStuff只是分别具有 1 个参数和它们类型的返回类型的方法。
如果我不那样做(我尝试了一些 typeof()之前转换),编译器总是抱怨它不能从Tto 转换float,反之亦然,即使我确定某些 Case-Switch / If-Else 也是这种情况声明。
有没有人知道一些更好的方法来做到这一点?
提前致谢,BOTHLine
编辑:由于很多人都说了同样的话,我要么在这种情况下根本不应该使用泛型,要么我的方法本身需要更通用..我的问题是我需要使用处理我正在检查的特殊情况的第 3 方方法(在这种情况下,float和bool类型)。对于默认情况,我已经以通用方式处理了所有事情。但是对于某些定义的类型,我就是做不到。
所以要更详细地说明为什么会这样:我目前正在为“Unity Engine”开发一个插件。Unity 内置了显示类型的方法(所有原始类型和一些特定于 Unity 的类型)。我有一个通用的 Wrapper 类,它应该能够包含任何类型。但是,当我想在 Unity Editor 提供的 GUI 中显示该包装器的内容时,我必须使用内置方法来显示基元(类似于UnityEditor.EditrGUI.FloatField())。没有这些方法,我永远无法显示任何内容。然后可以以更通用的方式显示可以分解为这些类型的任何其他内容。
所以基本的想法是有一个方法,它接受一个泛型类型,并根据传入的类型做不同的事情。
那是错误的想法。这不是应该使用泛型的方式。在这种情况下,您应该使用方法重载DoStuff为每个类型单独创建:
float DoStuff(float value) {/* float implementation here */}
bool DoStuff(bool value) {/* bool implementation here */}
...
Run Code Online (Sandbox Code Playgroud)
泛型的要点是使您能够编写在不同类型上运行相同的代码 - 因此它应该用于类型本身与代码无关的地方(如在任何泛型集合中),或者可以使用接口执行或所有可接受类型实现(或继承)的基类。此时,泛型通常仅在您希望方法返回接口(或基类)的特定实现时才需要。
| 归档时间: |
|
| 查看次数: |
580 次 |
| 最近记录: |