2010-02-22 61 views
4

它只是一個服務定位器類型的模式我正試圖實現,我想趕上嘗試註冊一個實現到它不屬於的接口,如:IsAssignableFrom,IsInstanceOf和BaseType測試

public void Add(Type interfaceType, object implementingObject) 
{ 
    // ... check for nulls    

    // NO GOOD 
    if(!implementingObject.GetType().IsAssignableFrom(interfaceType)... 

    // NO GOOD 
    if(!implementingObject.GetType().IsInstanceOf(interfaceType)... 

    // FINALLY! 
    if(!implementingObject.GetType().BaseType.IsAssignableFrom(interfaceType)... 

    // ... ok, add it   
} 

現在我最終想通過查看NUnit的isInstanceOf斷言內部使用BaseType.IsInstanceOf,但它似乎仍然是統一的。

有人可以解釋爲什麼這是有道理的?有沒有更簡單的方法來做到這一點?

回答

4

查看它的方法是從左到右,就像通常在用語言進行作業時一樣。

所以在C#中,調用assigningTo.IsAssignableFrom(assigningFrom)相當於(或任何你提到的其他方法)是把它作爲「將下面的代碼工作」:

<assigningTo type> variable = <instance of assigningFrom>; 

應用,爲您的代碼,要使用:

interfaceType.IsAssignableFrom(implementingObject.GetType()) 
interfaceType.IsAssignableFrom(implementingObject.GetType().BaseType) 

邏輯是要看看是否有任何實現對象的類型的可被分配給該接口的類型,或者,換句話說,如果實現對象可以被分配到interfaceType。

0

我想你想:

interfaceType.IsAssignableFrom(implementingObject.GetType()) 

具體類型爲什麼會從分配的接口?