擴展方法只是靜態方法,通過取一個假的「this」指針來實現「實例方法」:
public static class Extensions
{
public static int ANewFakeInstanceMethod(this SomeObject instance, string someParam)
{
return 0;
}
}
,您仍然可以調用它就像一個靜態方法 - 這是編譯器如何編譯代碼,總之:
var inst = new SomeObject();
int result1 = inst.ANewFakeInstanceMethod("str");
int result2 = Extensions.ANewFakeInstanceMethod(inst, "str");
如果你不能得到擴展方法的語法,你仍然可以使用第二個語法,即使你從你的靜態方法定義剝離this
:
var inst = new SomeObject();
int result2 = Extensions.ANewFakeInstanceMethod(inst, "str");
public static class Extensions
{
public static int ANewFakeInstanceMethod(SomeObject instance, string someParam)
{
return 0;
}
}
但
的語法和你試圖實現不使用沒有道理。您正在使用現有的DateTime
對象實例(它具有其自己的日期和時間值),並嘗試實現一個新的屬性/方法,該實例將返回一些不相關的常量。
只需使用一個靜態類,並在其上定義靜態只讀屬性:
public static class KnownDates
{
public static DateTime StSpruffingsDay
{
get
{
return new DateTime(1, 2, 3, 4);
}
}
}
如果這不是一個常數(如,你需要它當年),你應該添加一種需要花費一年的方法 - 不要試圖在DateTime
之上將其插入到擴展方法中,因爲DateTime
體現的不僅僅是一年。
public static class KnownDates
{
public static DateTime GetTalkLikeAPirateDay(int year)
{
return new DateTime(// Todo: Calculate the value, based on Sept 19th
}
}
如果你真的需要得到它相對於DateTime
,它仍然使你的代碼更清晰的將它傳遞給方法:
var fiveMinutesAgo = DateTime.Now.AddMinutes(-5);
// ...
var arrrr = KnownDates.GetTalkLikeAPirateDay(fiveMinutesAgo.Year);
...比它直接調用它off DateTime
實例:
var fiveMinutesAgo = DateTime.Now.AddMinutes(-5);
// ...
var arrrr = fiveMinutesAgo.GetTalkLikeAPirateDay();