我可以帮你将以下内容翻译成中文: 我能否向现有的.NET结构(如Date)添加枚举?

3

据说微软的日期结构中没有“月份枚举”。

我想知道的是,是否可能创建一个枚举并将其附加到DateTime结构上?第一时间想到的是扩展方法,但我不知道如何使用它们来实现这一点。

Dim july As DateTime.Months = DateTime.Months.July

Public Enum Months
    January = 1
    February = 2
    March = 3
    April = 4
    May = 5
    June = 6
    July = 7
    August = 8
    September = 9
    October = 10
    November = 11
    December = 12
End Enum

有人对此有什么想法吗?
更新: 我并不是想获取当前月份或给定日期的月份名称。我知道怎么做。我只是试图创建一个具有Month属性的类,并希望使用枚举来表示月份。由于这似乎是一个可能在其他地方有用的项,我不想将枚举放入我的类中,而是希望它“位于”直接相关的结构中,以便可以轻松找到。 感谢所有回复。我应该一开始就更清楚地表达我想要做什么。

“将枚举类型“附加”到结构体上”这句话的意思是什么?你想要实现什么目的并不清楚。” - Jon Skeet
1
你不能扩展 DateTime,因为它是一个结构体。你也不需要这样做。Months October = (Months)DateTime.Now.Month 就可以工作了。当然,已经有 ToString 函数可以完全做到这一点,所以这样做有点多余。 - Security Hound
1
@JonSkeet:他的意思是希望让他的“Months”枚举看起来嵌套在“DateTime”类中,以便他可以在代码示例的第一行中使用该语法。 - StriplingWarrior
2
你为什么想要这样做呢?有内置的方法可以将整数月份转换为名称,例如getabbreviatedmonthnamegetmonthname - Jamiec
1
当然,月份的名称是与文化相关的。内部使用的名称来自哪种文化并不重要(它们只是代码中的文字),而贵格会教派和其他一些非国教派新教徒则使用1、2、3(或者有时候使用“第一个月”、“第二个月”)来避免基于罗马异教的英语月份名称。因此,代码中已经使用的数字本身就是英语用户中一组人已经在使用的名称了。问题早已解决!;) - Jon Hanna
显示剩余6条评论
3个回答

7
你不能像那样为现有类型添加属性。
但是,你可以添加一个扩展方法,将整数转换为相应的枚举值,或者直接返回对应于该月份的枚举值。

谢谢您简单地回答我的问题。这正是我担心的,但我仍想确认一下。 - Airn5475

3

扩展方法存根:

public static class DateTimeExtensions
{
   public static string GetMonthName(this DateTime dateTime)
   {
       // add using System.Globalization;
       return DateTimeFormatInfo.GetMonthName(dateTime.Month);
   }

   public static Months GetMonth(this DateTime dateTime)
   {          
         return (Months)dateTime.GetMonthName();          
   }
}

用途:

DateTime mydate = dateTime.Now;    
string month = mydate.GetMonthName();
Months name = mydate.GetMonth();

2
return (Months)dateTime.Month; - Oded
@Oded:如果存在这样的枚举,返回值应该是 MonthEnum - sll
2
http://msdn.microsoft.com/en-us/library/system.globalization.datetimeformatinfo.getmonthname.aspx - Jamiec
你的 GetMonth 方法只有在一月份才似乎会返回任何东西。 - Chris Dunaway
@Chris Dunaway:是的,这只是一个例子,不管怎样我已经更新了。谢谢。 - sll
我认为应该按照Oded的建议将GetMonth实现为(Months)dataTime.Month。从可本地化字符串转换为枚举类型无法编译,也没有意义。 - CodesInChaos

3
您可以像这样添加扩展程序:
public static class DateTimeExtension
{    
    public static Months GetMonth(this Date dt)
    {
        return (Months)dt.Month;
    }
    public static Months GetMonthStr(this Date dt)
    {
        return ((Months)dt.Month).ToString();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接