2

我为 Enums (Enumerations) - 建立了一个扩展方法,命名它,说GetEnumSecondName

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

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

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 也不支持。谢谢。

4

1 回答 1

7

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

我有一个名为Unconstrained Melody的项目,它正是这样做的,在一篇文中介绍。

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

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

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

编译器抱怨:

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

所以不,你也不能在 VB 中做到这一点。奇怪的是,关于该错误的网页没有提到限制......

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

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

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

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

于 2011-08-17T14:34:45.993 回答