我有一个结构,用作动画和声音的容器。
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中,它们会在检查器中显示,并且可以在不编码的情况下进行配置。
答案 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)
我在这里选择三种解决方案:
第一个显然是令人讨厌的。虽然它最终会得到正确的结果,所以根据可能的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支持),但是很快就会产生大量的重载。