2015-11-26 91 views
0

我一直在嘗試寫在正確的時區和格式生成日期時間字符串的擴展方法。我的代碼是:擴展方法調用其他擴展wethod

public static class DateTimeExtension 
{ 
    public static string ToZoneString(this DateTime date, string zoneId, string formatter) 
    { 
     TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(zoneId); 
     return TimeZoneInfo.ConvertTime(date, zone).ToString(formatter); 
    } 

    public static string ToZoneString(this DateTimeOffset date, string zoneId, string formatter) 
    { 
     //in this case all goes well 
     //TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(zoneId); 
     //return TimeZoneInfo.ConvertTime(date, zone).ToString(formatter); 

     //in this case an unexpected error occurs   
     return date.ToZoneString(zoneId, formatter); 
    } 
} 

但是在編譯和運行我的ASP.NET MVC項目後

「中的w3wp.exe發生未處理的Microsoft .NET框架例外」

已發生。爲什麼這樣?如果我不在第二個方法中調用第一個方法,並且所有方法都正確執行。

+2

不會是'StackOverflowException'?我認爲你從* 2nd *方法調用* 2nd *方法;即使代碼看起來TimeZoneInfo.ConvertTime'的'一樣的,不同的重載使用 – ASh

+0

如果它進入第二個方法,將沒有結束 – Uriil

+2

您計算器上問一個問題,因爲你的程序變得計算器:) –

回答

2

我想,如果你更新第二種方法這樣它會爲你工作:

public static string ToZoneString(this DateTimeOffset date, string zoneId, string formatter) 
{ 
    //in this case all goes well 
    //TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(zoneId); 
    //return TimeZoneInfo.ConvertTime(date, zone).ToString(formatter); 

    //in this case an unexpected error occurs   
    return date.DateTime.ToZoneString(zoneId, formatter); 
} 

但根據您的需求,您可以選擇不同的方法來從的DateTimeOffset獲得日期時間(LocalDateTimeUtcDateTime

+0

非常感謝,它的工作原理。返回date.DateTime.ToZoneString(zoneId,格式化程序);也是可能的解決方案。 –

0

你的第二個方法不打電話給你的第一個,它只是再次調用您的第二個。其中再次呼叫你的第二個。其中再次呼叫你的第二個。等等,直到你的整個過程崩潰StackOverflowException

0

你永遠調用第一種方法。你的第二種方法調用本身。如果您想調用第一種方法,則需要先將DateTimeOffset轉換爲DateTime