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

本文关键字:枚举 编译 类型 参数 | 更新日期: 2023-09-27 17:55:49

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

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

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

这是我不可能梦想的密码:

[AttributeUsage(AttributeTargets.Enum)]
public class ShaderVariant : System.Attribute { }
void Method (T myEnum) where T : [ShaderVariant]Enum { }

我目前的选择是:

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

这个问题是关于 C# 的工作原理。我知道创建包装器重载更容易,但是征服处理程序方法以支持本质上是参数属性的感觉是错误的。

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

枚举

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

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