在方法的参数中使用动态枚举作为类型

Posted

技术标签:

【中文标题】在方法的参数中使用动态枚举作为类型【英文标题】:Using dynamic enum as type in a parameter of a method 【发布时间】:2011-02-22 06:07:36 【问题描述】:

我想要在这里实现的有点棘手。在继续之前,让我先简要介绍一下背景。

我知道我们可以使用枚举作为方法参数的类型。例如我可以做这样的事情(一个非常基本的例子)

命名空间测试 类定义枚举 公共枚举 MyEnum 值1 = 0, 值2 = 1 类 UseEnums 公共无效 UseDefinedEnums(DefineEnums.MyEnum _enum) //这里的任何代码。 公共无效测试() // "value1" 带有智能感知。 UseDefinedEnums(DefineEnums.MyEnum.value1);

我需要做的是创建一个动态枚举并将其用作类型来代替上面提到的DefineEnums.MyEnum

我尝试了以下方法。 1.使用我从网上获得的一种方法从字符串列表中创建一个动态枚举。并创建了一个我可以使用的静态类。

使用系统; 使用 System.Collections.Generic; 使用 System.Reflection; 使用 System.Reflection.Emit; 命名空间测试 公共静态类 DynamicEnum 公共静态枚举完成; 静态列表 _lst = 新列表(); 静态动态枚举() _lst.Add("value1"); _lst.Add("value2"); 完成 = CreateDynamicEnum(_lst); 公共静态枚举 CreateDynamicEnum(List _list) // 获取当前线程的当前应用程序域。 AppDomain currentDomain = AppDomain.CurrentDomain; // 在当前应用程序域中创建一个动态程序集, // 并允许它被执行并保存到磁盘。 AssemblyName aName = new AssemblyName("TempAssembly"); AssemblyBuilder ab = currentDomain.DefineDynamicAssembly( aName,AssemblyBuilderAccess.RunAndSave); // 在“TempAssembly”程序集中定义一个动态模块。对于一个单 // 模块程序集,模块与程序集同名。 ModuleBuilder mb = ab.DefineDynamicModule(aName.Name, aName.Name + ".dll"); // 定义一个名为“Elevation”的公共枚举和一个 // Integer 的底层类型。 EnumBuilder eb = mb.DefineEnum("Elevation", TypeAttributes.Public, typeof(int)); // 定义两个成员,“High”和“Low”。 //eb.DefineLiteral("Low", 0); //eb.DefineLiteral("高", 1); 诠释 i = 0; foreach(_list 中的字符串项) eb.DefineLiteral(item, i); 我++; // 创建类型并保存程序集。 返回 (Enum)Activator.CreateInstance(eb.CreateType()); //ab.Save(aName.Name + ".dll");
    尝试使用该类,但我无法找到上面定义的“完成”枚举。即我无法执行以下操作
公共静态无效TestDynEnum(Test.DynamicEnum.finished_finished) // 在这里用_finished 做任何事情。

我想这篇文章已经太长了,但我希望我已经说得很清楚了。

【问题讨论】:

有一个类似的so问题:***.com/questions/725043/dynamic-enum-in-c 【参考方案1】:

你要么必须传入一个对象,要么动态地创建你的方法。

我可以问为什么你不能只使用int 吗?似乎您将不得不动态创建大量代码才能将其作为枚举传递。

【讨论】:

我不能在这里使用 int,因为我需要 intellisense 中的值(在我的例子中是“value1”和“value2”),如果我使用 int,我将无法获得。 value1 和 value2 也是动态生成的,不能在静态枚举中硬编码。我已经修改了我的帖子以包含相同的内容。 当您在运行时动态生成代码时,您不会在智能感知中得到它。如果您正在预生成程序集,并添加对其的引用,那么使用枚举作为参数类型的方法应该可以正常工作。 嗨 Lasse 我知道留在同一个程序集中是行不通的,所以我将枚举部分的创建分离到不同的程序集中并在单独的程序集中使用相同的程序集。仍然无法找到枚举。 您是否正在生成枚举、保存程序集并创建对程序集的引用?还是您只在运行时创建枚举? 嗨 Lasse 很抱歉这么晚才回复这个帖子。正如您所建议的那样,我能够通过分离代码以将动态枚举生成到单独的 dll,然后将 dll 的引用提供给主程序集来实现这一点。感谢您的答复。您可以移动您的 cmets 作为答案,以便其他人可以从中受益。【参考方案2】:

当您动态创建枚举时,在您运行代码之前它并不存在。由于您无法在编译时使用该类型,因此您无法指定该类型的参数。仅当您已经有一个需要某种枚举(但不是任何特定枚举类型)的方法,或者您还创建了动态使用枚举的代码时,动态创建枚举才有用。

使用枚举实例可以做的基本上是获取值的字符串表示,将字符串解析回值,并获取已定义值的列表。使用Dictionary<int, string> 之类的方法更容易实现。

【讨论】:

嗨 Guffa 我明白你在这里想说的话。我将创建一个字典,其中包含我想在任何开发人员尝试使用我的方法时显示的值。这里只有1个问题。创建方法时如何在参数中使用此字典?请指教。

以上是关于在方法的参数中使用动态枚举作为类型的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中使用枚举作为泛型类型参数 [重复]

C#:将枚举类型作为参数传递

NodeJs GraphQL 枚举类型值作为动态

在打字稿中将枚举类型作为参数传递

可以在 Swift 中将枚举类型名称作为参数传递吗?

Typescript 枚举作为参数类型允许无效值