c# - 类型转换类型的扩展方法

标签 c# enums

我有一个简单的枚举,看起来像下面这样:

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/

相关文章:

c# - Java中的AES加密和C#中的解密

c++ - 无法访问嵌套私有(private)枚举的枚举数

java - 不兼容的类型 : inference variable E#1 has incompatible upper bounds Enum<E#2>

Python 枚举相等性能

ios - 在结构中获取与另一个关联的值的快捷方式

swift - SwiftUI 中的关联枚举状态

c# - 为什么 Visual Studio 项目仅限于一种语言?

c# - 使用 LINQ 创建一个 List<T> 其中 T : someClass<U>

c# - 复杂线条背后的逻辑

c# - 为单元测试创​​建 HttpPostedFileBase 实例