2011-09-19 43 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方法上尝试它,并且工作! –

相关问题