【问题标题】:Advanced Enumerations in C# [duplicate]C# 中的高级枚举
【发布时间】:2015-10-14 15:25:52
【问题描述】:

所以我是第一次在 C# 中使用枚举,但我认为它不会持续下去,因为我刚刚意识到你在使用它们时缺乏像在 Java 中那样的灵活性。

例如,我想在 Java 中做的等价物看起来像这样:

public enum Days {
    Mon("Monday"), Tue("Tuesday"), Wed("Wednesday"), Thu("Thursday", 93), Fri, Sat("Saturday", 44), Sun;

    private String longName;
    private int other;

    Days() {}
    Days(String longName) {
        this.longName = longName;
    }
    Day(String longName, int somethingElse) {
        this(longName);
        this.other = somethingElse;
    }

    @Override
    public String toString() {
        return this.longName + ", " + this.other;
    }
}

无论如何我可以在 C# 中做到这一点吗?据我所知,使用枚举只能执行以下操作:

public enum Days { Mon=1, Tue=2, Wed=3 }

它不一定是一个枚举,就像 Java 枚举一样。

【问题讨论】:

  • 您可以使用自定义属性。
  • 那么您希望能够给每个枚举值一个长名称吗?
  • Java 和 C# 的枚举看起来很相似,但它们完全不同:Java 的枚举本质上是类,其中每个枚举常量都是一个实例。相比之下,C 的枚举是序数类型的常量,例如 int
  • 与 Java 不同,C# 枚举与 C 和 C++ 一样仅包含常量。您可以创建一个类似于天数延长的类,并通过它调用您的函数。您可以将枚举的名称和/或值转换为字符串,将字符串转换为枚举的名称和/或值,如果这就是您要查找的全部内容
  • 您可以创建一个TypeConverter 类并将其用于格式化目的。

标签: c# enums


【解决方案1】:

你可以在枚举中添加一个显示名称

public enum Days {
    [Display(Name = "Monday")]
    Mon=1, 

    [Display(Name = "Tuesday")]
    Tue=2, 

    [Display(Name = "Wednesday")]
    Wed=3 
}

但这只是元数据。您不能像(显然)在 Java 中那样向它们添加实现。

可以使用具有静态只读属性的类:

public class Days {

    private String longName;
    private int other;

    Days() {}
    Days(String longName) 
    {
        this.longName = longName;
    }
    Days(String longName, int somethingElse) 
        : this(longName) 
    {
        this.other = somethingElse;
    }

    public override String ToString() 
    {
        return this.longName + ", " + this.other;
    }

    // just an example - in reality you'd probably want to keep one instance for each property in a static dictionary.
    public static Days Mon {get{return new Days("Monday",1);}}
    public static Days Tue {get{return new Days("Tuesday",2);}}
    // etc.

}

但它与“真实”枚举之间存在显着差异。

【讨论】:

  • 在有人要求您将其国际化之前效果很好;)
  • 所以我不能在每个不同的值和类上都有一堆字段......太好了:/
  • @MatthewWatson 你总是可以使用[Display(Name = "labelForName", ResourceType = typeof(Resources.Resources))] 重载这个属性。
  • @Spedwards 不是真正的enum。请参阅我的编辑以获取更接近您想要的示例。您还可以查看System.Color 的实现以获取另一个真实示例
【解决方案2】:

使用Extension Method,您可以向enum 添加其他功能。

public enum Days {
    MON =1,
    TUE=2,
    WED=3,
    THUR=4,
    FRI=5,
    SAT=6,
    SUN=7
}

public static class EnumTypeExtensions {
    public static string FriendlyString(this Days day) {
        switch (day) {
            case Days.MON:
                return "Monday";
            case Days.TUE:
                return "Tuesday";
            ...
        }
    }
}


//Usage-Example:
public void test() {
    Days tuesday = Days.TUE;
    string s = tuesday .FriendlyString();
    //s == "Tuesday"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-30
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多