【问题标题】:How to generate compile time enum values with a macro function in c#?如何在 C# 中使用宏函数生成编译时枚举值?
【发布时间】:2019-06-07 12:31:31
【问题描述】:

我想生成编译时枚举值。

就像我们在 c 中所做的那样

 #define macfun(x) (128 | ((unsigned int)(x) << 16L)

现在如果想生成另一个 const vale,我只需这样做

 #define JISCHAR    macfun(3)

我正在制作第三方库的 C# 包装器,它定义了许多不同类型的常量。

我真的可以在 C# 编译时生成枚举吗?

计算常量和分配给变量的其他方法是什么?

【问题讨论】:

  • AFAIK 在 C# 中没有可以像 C 中那样工作的宏。但是如果您已经在 C# 中创建枚举,您不能只从包装的 C 代码中分配值吗?
  • 一个选项有50多个值。和 8 个不同的选项。这就是为什么我一直在寻找更好的方法来做到这一点
  • 你可以使用 const/readonly 字段并使用私有函数来初始化它们(可能使它们全部静态)
  • 是的,我可以说选项一的静态常量类和一个静态方法来分配只读属性,它是一个常量值。我理解正确了吗?
  • 这就是我所想的——这确实意味着你不能像那样为枚举赋值。

标签: c# enums macros


【解决方案1】:

在 Visual Studio 中,您可以在构建之前和之后运行命令。然后您可以使用其他程序生成/编辑此枚举。您基本上可以编辑整个文件。

编辑: 您可以在 Project Properties 下找到此选项,然后在 Build Events 下找到此选项

【讨论】:

    【解决方案2】:

    根据@PaulFhere 的类似回答。

    一种可能的解决方案是:

         public sealed class UnixDBCSPages
         {
            public static readonly uint JIS           = MakeUnixDBCS(Convert.ToUInt32(0x0C));
            public static readonly uint EUCJP         = MakeUnixDBCS(Convert.ToUInt32(0x0D));
            public static readonly uint CNS11643_1    = MakeUnixDBCS(3);
            public static readonly uint EUC_CNS_1     = MakeUnixDBCS(7) ;                             
            public static readonly uint CNS11643_2    = MakeUnixDBCS(4) ;
            public static readonly uint EUC_CNS_2     = MakeUnixDBCS(8);                             
            public static readonly uint KSC1987       = MakeUnixDBCS(6);
            public static readonly uint GB2312        = MakeUnixDBCS(5);
    
    
            private static uint MakeUnixDBCS(uint wCodePage)
            {
                uint wUnixUnmask = Convert.ToUInt32(Flags.UnixUnmask);                
                return (wUnixUnmask | wCodePage) << 16;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多