如何在C#

时间:2015-08-11 09:06:24

标签: c# enums override

我有一个结构,用作动画和声音的容器。

    public struct BambooSounds{
    public Bamboo type;
    public AudioClip sound;
    public string animation;
}

在这种情况下,Bamboo是一个枚举,通过它我可以识别BambooSounds数组中的条目。

这些是获取相应动画和声音的方法

public string BambooAnimation(Bamboo animation)
public AudioClip BambooSound(Bamboo sound)

问题是我需要为每个新枚举重新实现这些方法,因为我无法覆盖这些方法,但我使用它们的模式并没有改变(struct,该结构的数组,返回数组内容的方法)结构)。

我如何改进这一点,因此我具有类型安全性和易用性,并且只需要实现一次逻辑。尝试使用泛型方法,但我陷入困境,需要将泛型参数转换为具体类型,以便我可以将它的值与struct条目进行比较。

P.S。:我绝对想要保留结构,或者保持类,因为在Unity中,它们会在检查器中显示,并且可以在不编码的情况下进行配置。

2 个答案:

答案 0 :(得分:1)

如果我理解你的问题,你想构建一个可以获取所有枚举类型的函数。 因此,举个例子,我们有两个枚举:

public enum Enum1
{
    Test
}
public enum Enum2
{
    Test2
}

这是通用功能:

static void TestEnum<T>(T enumType) where T : struct
        {
            if (enumType is Enum1)
            {
                Console.WriteLine("Enum1");
            }
            if (enumType is Enum2)
            {
                Console.WriteLine("Enum2");
            }
        }

在这里你可以如何称呼它:

TestEnum<Enum1>(Enum1.Test);
TestEnum<Enum2>(Enum2.Test2);

答案 1 :(得分:0)

我在这里选择三种解决方案:

  1. 只需手动编码所有方法。
  2. 根据@Kram的回答,在通用方法中测试类型。
  3. 使用T4模板。
  4. 第一个显然是令人讨厌的。虽然它最终会得到正确的结果,所以根据可能的enum参数的数量,我可能只是处理它(可能在我第一次编码时使用某种脚本)。

    第二个缺点是不能提供完整的编译时类型安全性,但它可以工作,并且合理地工作。它仍然包含大量的手动重复。

    T4模板可能很简单:

    <#@ template language="C#" #>
    <#@ output extension=".gen.cs" #>
    using System;
    
    namespace SomeNamespace
    {
      public partial struct BambooSounds
      {
      <#foreach(var type in new []{"Bamboo", "Wood", "Metal", "Whatever"};){#>
        public string <#=type#>Animation(<#=type#> animation)
        {
          // Implementation
        }
        public AudioClip <#=type#>Sound(<#=type#> sound)
        {
          // Implementation
        }
        public void ThisMethodOverloadsToShowThatCanBeDoneToo(<#=type#> thing)
        {
          // Implementation
        }
      <#}#>
      }
    }
    

    struct设置为partial意味着您可以将大部分定义放在普通的.cs文件中,这通常更容易使用,并且让T4只生成代码你需要它来处理。

    虽然T4不像普通代码那样好用(较差的IDE支持),但是很快就会产生大量的重载。