我正在尝试编写一个泛型方法,它会在传递枚举时返回特定的标记。以下是已经减少到此问题所需的最低代码的方法。
public static string GetMarkup(Type enumType)
{
StringBuilder builder = new StringBuilder();
foreach (var val in Enum.GetValues(enumType))
{
builder.Append(val.ToString());
}
return builder.ToString();
}
这样调用方法,其中CopyType是枚举:
GetDropDownListHtml(typeof(CopyType))
目标是能够调用我为我将传递给此方法的枚举编写的ToString()扩展方法。问题是为了使方法具有通用性,我需要使用var
在foreach声明中声明我的变量,但是将它包装起来。我有一个装箱的CopyType对象,而不是CopyType的枚举。
作为回应,我尝试了许多这样的想法,但无济于事:
((typeof(enumType))val.ToString()
有什么想法吗?
答案 0 :(得分:0)
无法使用扩展方法对特定枚举执行此操作。您需要扩展扩展方法以支持所有Enum
类型,在那里添加is
语句,您可以使用它只在必要时进行转换,或者为您调用的函数写一个特殊的重载只是为了这种类型的枚举。这与扩展方法的实际实现方式有关。
编译器将扩展方法转换为静态形式:myCopyType.ToString()
在编译时变为CopyType.ToString(myCopyType)
。但是根据您的场景(甚至是泛型),编译器无法确定要使用的类型,因为直到运行时才确定类型。
这留下了以上三个选择。
在我自己的代码中,我根据代码here选择了第一个选项。您可以在任何.GetLabel()
类型上拨打Enum
,并且可以专门为此特殊标签添加特殊标签。
此外,您还需要使用foreach (Enum val in ...
,以确保编译器知道它是Enum
。