2009-12-26 160 views
2

我有兩個接口IDto1和IDto2。 IDto2繼承IDto1。這兩個接口都用於DTO,因此我希望將「複雜」代碼保留在其實現中 - 我通過將單個擴展方法初始化爲每個接口的靜態類來實現此目的。接口的擴展方法

因此,我最終得到以下類型的IDto1,IDto2,IDto1Extensions,IDto2Extensions。

我想有兩個接口的初始化擴展方法,但對於每一個有不同的實現。

在客戶端代碼中,我想用這樣的代碼:

(dto as IDto1).Initialize(); 

...,我想基於在運行時解析類型的DTO變量來調用相關的擴展方法。

這是可能在C#中,如果不是爲什麼不呢?

編輯:

對不起,當然這樣的:

(dto as IDto1).Initialize(); 

...將調用初始化方法對IDto1類型。我的意思是將dto變量作爲參數傳遞給一個方法,在這種情況下,我相信該方法將根據前面指定的繼承層次結構以多態方式進行選擇。

感謝您的答案。

回答

4

你試圖在這裏實現的是某種多態。擴展方法是靜態方法。在OOP中,polymorphysm僅適用於實例方法。

一個選項可能是切換到抽象類。

+0

由於直接回答問題而提出了一個解決方法。其他答案也很棒。 – Ben 2009-12-26 19:32:16

3

你試圖完成的是不可能的,因爲擴展方法在編譯時被解析,而在你的情況下,dto變量的實際類型只在運行時才被知道。

4

看你的語句:

(dto as IDto1).Initialize(); 

...,我想基於在運行時解析類型的DTO變量來調用相關的擴展方法。

括號內的事情的「解決型」是正是IDto1。它不能是其他任何東西,所以這是編譯器將使用的。確實變量永不改變類型(我假定你的意思是對象所指的由變量的值)。

在.NET 4.0/C#4.0中,此處用於輸入鴨子的選項可能是實例方法,而dynamic ...

((dynamic)dto).Initialize(); 

...但說實話,我不明白爲什麼你不能只是增加你的Initialize方法的界面,並使用多態,因爲這聽起來離你最近嘗試來形容。

1

如果你想使你的代碼更加動態,您可以定義您在配置文件中需要的類,並使用這樣的事情

String className = ConfigurationManager.AppSettings["Interface"].ToString(); 

IDto1 dto = (IDto1)Activator.CreateInstance(Type.GetType(className)); 

在此示例中,我使用的第一行得到的類名。

第二行創建Object的一個實例。

吉列爾梅·費雷拉 http://guilhermeferreira.wordpress.com/