2011-09-19 75 views
2

我想創建一個可用於依賴注入的工廠對象字典。C#返回一個類型而不必知道它

例如,假設我有一個名爲ServiceLocator的靜態類。一個應用程序可以使用:

ITest test = ServiceLocator<ITest>.GetInstance() 

得到一個實現ITest接口的對象。

要實現這一點,我首先創建了一個接口IFactory的

public interface IFactory<T> 
{ 
    T GetInstance<T>(); 
} 

然後,例如,ITEST的具體實現可以是這個樣子:

public class TestFactory : IFactory<ITest> 
{ 
    public ITest GetInstance<ITest> 
    { 
    return new (ITest)OneImplementationOfITest(); 
    } 

} 

服務定位,然後像這樣定義的:

public static class ServiceLocator 
{ 
    private static Dictionary<string,object> m_Factories; 

    public static T GetInstance<T> 
    { 
     string type = typeof(T).ToString(); 

     return ((IFactory<T>)Factories[type]).GetInstance(); 
    } 
} 

不幸的是,IFactory中的T給出了一個compil ER錯誤:

「T必須是引用類型,以便用它作爲通用型方法的參數T ......」

我可以想辦法解決這個問題,例如定義代替的IFactory IFactory控件的:

public interface IFactory 
{ 
    object GetInstance(); 
} 

但隨後用戶將需要轉換的對象本身:這是相當尷尬,並可能導致錯誤

ITest test = (ITest)ServiceLocator<ITest>.GetInstance(); 

(如不正確的澆鑄)

更妙的是,如果有寫方式:

ITEST測試= ServiceLocator.GetInstance(「ITEST」),但還沒有想出如何做到這一點。

回答

5

嘗試這種情況:

public interface IFactory<T> 
    where T: class 
{ 
    T GetInstance<T>(); 
} 

這限制T爲引用類型。順便說一句,這是許多可用generic type constraints之一。

+0

其實我以前曾嘗試過,結果相同。然而,你的文章給了我一個想法,在服務定位器中的GetInstance方法上嘗試它,並且工作! –

相關問題