Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C在泛型类型上使用Switch Case/If Else有更好的方法吗_C#_If Statement_Generics_Casting_Switch Statement - Fatal编程技术网

C# C在泛型类型上使用Switch Case/If Else有更好的方法吗

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);

我目前正在尝试对泛型类型进行一些转换。 所以基本思想是有一个方法,它接受泛型类型,并根据传入的类型执行不同的操作

为了简单起见,我将只展示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个参数和其类型的返回类型的方法

如果我不这样做,我以前尝试过一些类型的强制转换,编译器总是抱怨它不能从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方法,然后用我的特殊情况继承并以正确的方式重写该方法,因为在那里我将不再需要进行任何类型检查。非常感谢很高兴能帮忙:-