gpt4 book ai didi

.net - 通用约束中的枚举

转载 作者:行者123 更新时间:2023-12-05 01:12:02 25 4
gpt4 key购买 nike

我为枚举(Enumerations)构建了一个扩展方法——命名它,说GetEnumSecondName

static string GetEnumSecondName(this Enum myEnumInstance)    {...}

现在,我有一个通用方法,它应该采用枚举并返回该类型的所有第二个名称。

List<string> GetSecondNames<T : ?T:Enum ? >()
{
// ...

foreach T member in GetAllMembers<T>()
// should work only for Enum instances
resultList.Add(member.GetEnumSecondName());

// ...
}

是否有解决方法?

编辑:

据我了解(感谢 Jon Skeet),C# 不支持这种约束。如果有任何VB.NET 专家确认“普通”VB.NET 也不支持它。谢谢。

最佳答案

是的,有一个解决方法。你可能不喜欢它。您必须重写 IL 以表达您想要的约束——因为 CLR 允许这样做,但 C# 不允许。 (编译器尊重约束;它只是不允许您在 C# 代码中表达它。)

我有一个名为 Unconstrained Melody 的项目正是这样做的,在 blog post 中介绍.

很遗憾你不能表达这一点,也许它会在未来版本的语言中得到修复。据我所知,目前只有 IL 重写。

编辑:我刚刚在 VB 中尝试了您想要的约束:

Foo(Of T As { System.Enum, Structure }) (...)

编译器提示:

error BC32061: 'Enum' cannot be used as a type constraint.

所以不,你也不能在 VB 中完成。奇怪的是,web page about that error没有提到限制...

编辑:对于任何想玩 Unconstrained Melody 的人来说,需要几个步骤才能让它工作:

  • 您需要确保您有一个合适的 SDK 目录,如 ConstraintChanger\Program.cs 所指。特别是,检查 \Program Files\Microsoft SDKs\Windows 以查看您的版本 - 并适当更改 Program.cs
  • 至关重要的是,您需要在顶层有一个名为“重写”的目录(即 lib 旁边)
  • 如果您使用的是 VS2010,则需要在开始时完成项目升级

一旦所有这些都正确无误,您应该可以按 Ctrl-Shift-B 并获得一个可用的构建。 不要删除和替换项目引用 - 测试程序集需要引用重写的程序集,而不是创建它的项目。

今晚我将尝试解决其中的一些问题 - 甚至可能创建一个 Nuget 包...

关于.net - 通用约束中的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7094586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com