1

我正在做一些 ASP.NET MVC 3,并且我正在设置几个扩展方法来使用 Enums。其中一个是一个花哨的 ToString(),它查找 [Description] 属性,另一个从枚举构建一个 SelectList 以与 Html.DropDownList() 一起使用。这两种方法都在同一个静态类中。

public static SelectList ToSelectList<TEnum>(this TEnum? enumval) where TEnum : struct {
    var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = e, Name = e.GetDescription() };
    SelectList list = new SelectList(values, "ID", "Name", enumval);
    return list;
}

public static string GetDescription<TEnum>(this TEnum? enumval) where TEnum : struct {
    //Some reflection that fetches the [Description] attribute, or returns enumval.ToString() if it isn't defined.
}

但是编译器会大喊大叫Name = e.GetDescription(),说...

“TEnum”不包含“GetDescription”的定义,并且找不到接受“TEnum”类型的第一个参数的扩展方法“GetDescription”(您是否缺少 using 指令或程序集引用?)

这并不令人意外,但我不确定如何让编译器将 GetDescription() 识别为 ToSelectList() 的 enumval 参数的有效扩展方法。我意识到我可以通过将 GetDescription() 的内容移动到私有静态方法中来完成这项工作,并使扩展方法只是对其的包装,但是链接通用扩展方法似乎是我应该知道如何正确执行的事情。

4

2 回答 2

2

e不是可以为空的结构;它只是一个结构。 GetDescription采用可为空的结构。

要么使e可空,要么使GetDescription.

于 2013-05-08T14:48:49.797 回答
0

您使用 aNullable<TEnum>作为参数的任何特殊原因?我很难想到为什么要在空值上调用这些扩展方法中的任何一个。

如果您摆脱了可为空的要求,则可以将它们设为非泛型并Enum直接基于类型,这样更友好(包括让您以通常的方式将扩展方法语法与枚举值一起使用):

public static SelectList ToSelectList(this Enum enumval)
{
  var values = from Enum e in Enum.GetValues(enumval.GetType()) select new { ID = e, Name = e.GetDescription() };
  SelectList list = new SelectList(values, "ID", "Name", enumval);
  return list;
}

public static string GetDescription(this Enum enumval)
{
  //Some reflection that fetches the [Description] attribute, or returns enumval.ToString() if it isn't defined.
}

然后你可以这样做:

MyEnum enumval = MyEnum.Whatever;
var list = enumval.ToSelectList();

...我认为您无法使用当前的通用版本来执行此操作-您必须使用以下命令调用它:

MyEnum enumval = MyEnum.Whatever;
var list = ((MyEnum?)enumval).ToSelectList();
于 2013-05-08T15:09:18.983 回答