我有一个简单的枚举,看起来像下面这样:
public enum Brand
{
[Description("Friendly Brand Name")]
Brand1,
[Description("Once Again")]
Brand2
} // eo enum Brand
我有一个具有以下签名的扩展方法:
public static string ToDescription(this Enum self) { /* .. implementation .. */ }
在 LINQPad 中的快速检查显示:
Brand brand = Brand.Brand1;
brand.ToDescription().Dump();
...一切都按预期工作。
现在是有趣的部分。在我的代码中,此时我想遍历任意枚举的值(在本例中为 Brand
),而我只有一个 System.Type
来继续。首先,我实现了一个Array
的快速扩展方法:
public static IEnumerable<object> AsEnumerable(this Array self)
{
foreach(object o in self)
yield return o;
} // eo AsEnumerable
知道我的类型是 Enum
,我因此遍历值(其中 type
是实际的 Brand
枚举类型)(注意: CastTo
只是Convert.ChangeType
的简写扩展方法):
foreach (var enumValue in Enum.GetValues(type).AsEnumerable().Select((e) => e.CastTo(type)))
Console.WriteLine(enumValue.ToDescription());
我收到以下运行时错误:
'MyNameSpace.Brand' does not contain a definition for 'ToDescription'
调试,在立即窗口中enumValue
的类型确实是Brand
。我猜这可能与扩展方法的工作方式有关——或者我遗漏了一些明显的东西。也许有解决方法?
最佳答案
我认为你的CastTo
只是在运行时更改类型,为什么不使用 Cast<T>
相反?
foreach (var enumValue in Enum.GetValues(type).Cast<Enum>())
Console.WriteLine(enumValue.ToDescription());
关于c# - 类型转换类型的扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20075757/