将Enum参数限制为某些枚举类型(在编译时)

时间:2015-06-13 13:33:31

标签: c# enums

我创建了一个static void Method (Enum myEnum),但我只想提供某些枚举类型,或者在编译时遇到我的错误。由于我正在尝试使用我的代码(使用游戏机制作为着色器变体),我需要随心所欲地更改接受的类型,尽可能少地维护Method类。

基本上,我正在努力处理枚举,我可以非常轻松地使用类(创建一个共享基类用作参数类型)。首先想到的是属性:

  • 自定义属性可以以任何方式影响编译吗?如果可以,我会感到惊讶。
  • 我可以用Enum类型的任何方式模仿类继承,虽然只是为了创建某种类别来限制方法参数吗?

这是我梦寐以求的梦想代码:

[AttributeUsage(AttributeTargets.Enum)]
public class ShaderVariant : System.Attribute { }

void Method (T myEnum) where T : [ShaderVariant]Enum { }

我目前的选择是:

  • 创建上述属性以标记所选的Enum声明,并在运行时对其做出反应(如果myEnum.GetType()没有该属性,则抛出ArgumentException)。这种方法默默地允许我在编码时搞砸,但只需要为我想要的任何枚举添加/删除属性就是我的梦想工作流程。
  • 为每种类型声明一个荒谬的包装器重载并永远维护Method类,注定要为项目的每个细微更改反复提交相同的文件。但是在编译时工作。

这个问题是关于C#如何运作。我知道创建包装器重载更容易,但是对处理器方法进行调整以支持基本上是参数属性的感觉是错误的。

1 个答案:

答案 0 :(得分:0)

枚举只是常数的简称。 如果一个枚举的成员是不同的,因为有些人必须在编译时可以接受一个方法,而有些则不行。那么也许你需要两个枚举。一个人可以接受一个方法,一个人拥有所有可能的选择。

枚举是非常简单的结构,没有继承。如果你觉得你需要继承,那么你可能不应该使用Enum并使用类。