我有一个Enum
Public Enum MyEnum
<StringValue("Bla Bla")> _
BlaBla
<StringValue("bbble bbble")> _
BleBle
End Enum
我做了一个扩展方法(GetStringValue),它接受Enum
并返回StringValueAttribute
的值,如果有的话。
我可以Dim sValue = MyEnum.BlaBla.GetStringValue()
现在,我想要一个“扩展”方法,它将所有枚举值作为字符串列表返回给我。
我想像这样申请:MyEnum.GetStringValues()
有可能吗?
答案 0 :(得分:3)
虽然您无法向类型添加静态扩展方法,但您可以按如下方式声明一个新类:
class EnumHelper
{
public static IEnumerable<string> GetStringValues<TEnum>()
where TEnum : struct, IComparable, IFormattable, IConvertible
{
var enumType = typeof(TEnum);
if (!enumType.IsEnum) {
throw new ArgumentException("T must be an enumerated type");
}
foreach (Enum item in Enum.GetValues(enumType))
{
yield return item.GetStringValue();
}
}
}
并按如下方式调用:
class Program
{
enum Rainbow { Red, Orange, Yellow, Green, Blue, Indigo, Violet }
static void Main(string[] args)
{
foreach (var item in EnumHelper.GetStringValues<Rainbow>())
{
Console.WriteLine(item);
}
Console.ReadKey(false);
}
}
答案 1 :(得分:2)
有可能吗?
没有。您可以将扩展方法添加到特定类型的实例,但不能添加到特定类型本身。
这是考虑这个问题的一种方法:扩展方法只是静态类上静态方法的语法糖,其中方法的第一个参数是扩展方法的“接收者”。是否可以在静态类上编写静态方法,该静态类的第一个参数是某些,如MyEnum
?不能。您不能将类型名称作为参数传递给方法(您可以传递类型句柄的实例(例如,typeof(MyEnum)
),但不能传递类型名称本身)。因此,你所要求的是不可能的。