2016-02-05 38 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