2010-04-23 38 views
2

我可以有一個擴展方法是這樣的:您可以在類型的某個類型上使用擴展方法,而不使用類型的實例嗎?

DateTime d = new DateTime(); 
d = d.GetRandomDate(); 

GetRandomDate是我的擴展方法。然而,上述沒有多大意義。更好的是:

DateTime d = DateTime.GetRandomDate(); 

但是,我不知道該怎麼做。一個擴展方法創建爲:

public static DateTime GetRandomDate(this System.DateTime dt) 

將只在上面的第一個示例中添加GetRandomDate(),而不是第二個。有沒有辦法達到預期的行爲?

+0

爲什麼你不在Random類上創建一個擴展方法(NextDate) – 2010-04-23 08:50:36

+0

我剛剛使用了一個隨機日期作爲例子,但在這種情況下這是有意義的。 – NibblyPig 2010-04-23 09:40:31

回答

2

你爲什麼要?如果你想調用一個靜態方法,爲什麼不直接調用它?

好的,您需要使用類似DateTimeHelper.GetRandomDate()而不是DateTime.GetRandomDate()

+0

至於爲什麼,你不調用MyStringHelper.StripSpaces(myString)而不是使用像s =「a b c」這樣的擴展方法的原因相同; s.StripSpaces(); - 方便 – NibblyPig 2010-04-23 08:43:32

+0

好的,但是你要剝離一個特定的字符串,而不是忽略實例並生成完全不同的東西。 – 2010-04-23 09:54:20

3

都能跟得上 - 不可能

你需要訪問自己的靜態類中的方法...

0

只是拋出這個,但你可以創建一個部分靜態類的日期時間和拋出擴展方法?

+0

不,你不能這樣做,因爲現有的DateTime類也需要聲明爲部分。 – 2010-04-23 15:56:36

+0

不,我敢肯定,部分類是編譯器功能,而不是CLR功能,所以即使DateTime是部分類也不行,因爲你不能在一個程序集中包含類的一部分,而在另一個程序集中不能包含部分類。 – Qwertie 2010-04-23 16:10:36

+0

@Qwertie - 但是你不能把它放在System命名空間中嗎? (當然,按下大綠色按鈕時不會重新編譯系統命名空間)@Steven - 你是對的 - 我只是在代碼中自己試過,並不會飛。 – Perplexed 2010-04-23 16:10:46

相關問題