2016-02-05 41 views
1

我想要做的是让用户输入一个日期并且有一个班级返回该月的最后一天。所以,我把这个在我的课模块:从班级中返回日期

public static class StringExtensions 
{ 
    public static DateTime LastDayOfMonth(DateTime MyDate) 
    { 
     DateTime today = MyDate; 
     DateTime EOM = new DateTime(today.Year,today.Month, 
          DateTime.DaysInMonth(today.Year, 
          today.Month)); 
      return EOM; 
    } 
} 

在我的代码隐藏,我有这样的:

DateTime LDOM = StringExtensions.LastDayOfMonth(txtCIT.Text); 

我也尝试硬编码的日期,如:

DateTime LDOM = StringExtensions.LastDayOfMonth('1/12/2016'); 

我得到这些错误:

错误14的最佳重载的方法匹配 'ClientDPL.StringExtensions.LastDayOfMonth(System.DateTime的)' 有一些 无效的参数

错误15参数1:不能从 '字符串' 转换为 'System.DateTime的'

任何人都可以看到我做错了什么?

+2

如果你打算把它放在一个名为StringExtensions类,有一种期望,它是一个[扩展方法(https://msdn.microsoft .com/en-us/library/bb383977.aspx)并且它接受一个字符串作为第一个参数。你的方法不会做这些。 – mason

+1

你确定你在第二个例子中使用单引号吗?如果你是在字符文字中出现过多字符的错误。 – juharr

回答

1

由于@mason在评论中指出,一个可能是更好的方式来做到这一点是使用类似于一个DateTime扩展方法:

public static class DateTimeExtensions 
{ 
    public static DateTime LastDayOfMonth(this DateTime date) 
    { 
     DateTime EOM = new DateTime(
      date.Year,date.Month, 
      DateTime.DaysInMonth(
       date.Year, 
       date.Month 
      ) 
     ); 

     return EOM; 
    } 
} 

可以使用,如:

Console.WriteLine(DateTime.Now.LastDayOfMonth()); 

见它在行动:

https://dotnetfiddle.net/59Oj7c

+0

这里的所有答案都非常有用,但我最终使用了这个,所以我会在这里给对勾。我可能会在晚些时候探索Vadim的TryParse想法。 –

3

您的方法预计的参数为DateTime

在您的来电:

DateTime LDOM = StringExtensions.LastDayOfMonth(txtCIT.Text); 

DateTime LDOM = StringExtensions.LastDayOfMonth('1/12/2016'); 

在这两种情况下你不能传递一个DateTime。在调用函数之前,您需要将您的string转换为DateTime

很多做的是,这里的方法:Converting a String to DateTime

+2

或者,可以将'LastDayOfMonth()'方法更改为接受'string'参数并在内部处理解析。 –

+0

其实第二个不是一个字符串,它是一个无效的字符。 – juharr

+0

@juharr对此表示歉意。 – Kritner

4

您正在尝试String参数传递给那些需要DateTime参数的方法。然后,你需要parse你的价值第一:

var textCitValue = DateTime.Parse(txtCIT.Text); 
DateTime LDOM = StringExtensions.LastDayOfMonth(textCitValue); 

更好的方法是使用安全的方法DateTime.TryParse永远不会抛出异常

DateTime textCitDateTime; 
if(DateTime.TryParse(txtCIT.Text, out textCitDateTime)) 
{ 
    DateTime LDOM = StringExtensions.LastDayOfMonth(textCitValue); 
    // your logic here 
} 
else 
{ 
    // handle invalid textbox date here 
} 

此外,你必须清楚命名。您的StringExtensions类有一种方法不是扩展方法,它使用DateTime作为参数。这将是更好的重命名你的类并更改LastDayOfMonth签名旁边似:

public static class DateTimeExtensions 
{ 
    public static DateTime LastDayOfMonth(this DateTime date) { ... } 
} 

然后你就可以调用此方法来为DateTime公共实例方法:

DateTime LDOM = textCitValue.LastDayOfMonth(); 

你也可以改变方法签名到public static DateTime LastDayOfMonth(string date),但它会打破single responsibility principle您的方法。

+3

另外,'LastDayOfMonth()'可以被改变为接受'string'参数,然后你在这里显示的逻辑可以封装在那个方法中。 –

+1

@ Code-Apprentice是的,但是'LastDayOfMonth()'只能处理一种格式的输入字符串(或者我们需要添加额外的格式参数)。现在它封装了一项任务,并承担一项责任。 –

+0

我不清楚'LastDayOfMonth()'如何处理只有一种格式。你对单一责任做出了很好的评价。我的建议可能会打破这一点。 –

1

希望我ñ不要仅仅通过提出这个答案来重新陈述问题并且事先道歉,但是我会更加关注如下的两种类型的扩展(注意用问号表示的Nullable返回类型):

public static class StringExtensions 
{ 
    public static DateTime LastDayOfMonth(this DateTime self) 
    { 
     return new DateTime(self.Year, self.Month, DateTime.DaysInMonth(self.Year, self.Month)); 
    } 

    public static DateTime? LastDayOfMonth(this string self) 
    { 
     DateTime dt; 
     if (!DateTime.TryParse(self, out dt)) 
      return null; 

     return dt.LastDayOfMonth(); 
    } 
} 

然后使用它的代码:

private void App() 
{ 
    var lastDayFromDate = (DateTime.Now).LastDayOfMonth(); 
    var lastDayFromString = "1/12/2016".LastDayOfMonth(); 

    if (lastDayFromString != null) 
    { 

    } 
} 
+0

对于第一种方法,使用'DateTime'的方法,不需要返回Nullable'DateTime':if永远不会返回null。我会用一个常规的'DateTime'返回值声明它,所以客户端代码将不需要检查“如果它不为空” –

+0

@GianPaolo正确的你:) – rdev5