C# C在泛型类型上使用Switch Case/If Else有更好的方法吗
我目前正在尝试对泛型类型进行一些转换。 所以基本思想是有一个方法,它接受泛型类型,并根据传入的类型执行不同的操作 为了简单起见,我将只展示float、bool和default的用法 设置如下所示,其中T是由类本身定义的泛型类型:C# C在泛型类型上使用Switch Case/If Else有更好的方法吗,c#,if-statement,generics,casting,switch-statement,C#,If Statement,Generics,Casting,Switch Statement,我目前正在尝试对泛型类型进行一些转换。 所以基本思想是有一个方法,它接受泛型类型,并根据传入的类型执行不同的操作 为了简单起见,我将只展示float、bool和default的用法 设置如下所示,其中T是由类本身定义的泛型类型: protected T DoStuff(T value) { switch (value) { case float floatValue: float result = DoFloatStuff(floatValue);
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个参数和其类型的返回类型的方法
如果我不这样做,我以前尝试过一些类型的强制转换,编译器总是抱怨它不能从t强制转换为float,反之亦然,即使我确定某些case-Switch/If-Else语句也是如此
有人知道更好的方法吗
提前感谢,,
博思林
编辑:
既然很多人都说了同样的话,我要么根本不应该在这种情况下使用泛型,要么我的方法本身就需要更泛型。。
我这里的问题是,我需要使用第三方方法来处理我正在检查的特殊情况,在本例中是float和bool类型。对于默认情况,我已经以通用方式处理了所有问题。但对于某些定义的类型,我就是做不到
因此,更详细地说,为什么会这样:
我目前正在为Unity引擎开发一个插件。Unity内置了方法来显示所有基元类型的类型和一些Unity特定的类型。我有一个泛型包装器类,它应该能够包含任何类型。但是,当我想在Unity Editor提供的GUI中显示包装器的内容时,我必须使用内置方法来显示原语,比如UnityEditor.EditrGUI.FloatField。没有这些方法,我永远无法显示任何东西。
然后,可以细分为这些类型的任何其他内容都可以以更通用的方式显示
所以基本思想是有一个方法,它接受泛型类型,并根据传入的类型执行不同的操作
这是错误的想法。这不是泛型的使用方式。在这种情况下,应使用方法重载分别为每种类型创建DoStuff:
float dostuffloat值{/*此处的浮点实现*/}
bool DoStuffbool值{/*bool实现在这里*/}
...
泛型的要点是使您能够编写在不同类型上运行相同代码的代码-因此,它应该在类型本身与代码无关的情况下使用,就像在任何泛型集合中一样,或者可以使用接口或基类执行所有可接受的类型实现或继承。此时,泛型通常仅在您希望方法返回接口或基类的特定实现时才需要。让编译器为您分类:
protected void DoStuff(float v){}
protected void DoStuff(int v){}
// and so on
//and finally the default:
protected void DoStuff(object v){}
public void Work(T value)
{
DoStuff(value)
}
这不是一个简单的答案,但从许多标准来看,这是正确的方法。可能会有一个简短的答案,但如果我是你,我就不会麻烦了 这是工厂模式的味道。顾名思义,泛型应该是泛型的,与类型无关,如果是的话,您可以这样做
interface IDoStuffer<T>
{
T DoStuff(T value)
}
class DoStuffFloat : IDoStuff<float>
{
public float DoStuff(float value)
{
//Do your float stuff
}
}
class DoStuffBool : IDoStuff<bool>
{
public bool DoStuff(bool value)
{
//Do your bool stuff
}
}
然后你可以让工厂给你一个正确的实现
class DoStuffFactory
{
public IDoStuff<T> GetDoStuff<T>()
{
if(typeof(T) == typeof(float))
return new DoStuffFloat();
//And other types
}
}
如果DoFloatStuff和DoBoolStuff如此不同,以至于它们不能被泛型化,那么你就没有泛型的用处了。如果你不知道对象的类型,那就放弃并让对象dostufobject值。如果编译器可以在编译时计算出类型,那么他应该使用方法重载,而不是泛型,最肯定的是不使用对象。嘿,非常感谢你的评论。首先,我编辑了我的第一篇文章,使自己更清楚一点,因为我并没有很好地解释一切。因为我当然想以一种通用的方式处理大多数案例,所以我只需要整理一些特殊的案例。但是,是的,你说的那不是泛型的想法真的让我想到了。我应该能够以一种通用的方式使用DoStuff方法,然后用我的特殊情况继承并以正确的方式重写该方法,因为在那里我将不再需要进行任何类型检查。非常感谢很高兴能帮忙:-