我想创建一个可用于依赖注入(inject)的工厂对象字典。
例如,假设我有一个名为 ServiceLocator 的静态类。应用程序可以使用:
ITest test = ServiceLocator<ITest>.GetInstance()
获取实现 ITest 接口(interface)的对象。
为了实现这一点,我首先创建了一个 Interface IFactory
public interface IFactory<T>
{
T GetInstance<T>();
}
然后,例如,ITest 的具体实现可能如下所示:
public class TestFactory : IFactory<ITest>
{
public ITest GetInstance<ITest>
{
return new (ITest)OneImplementationOfITest();
}
}
ServiceLocator 的定义如下:
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 给出了编译器错误:
“T 必须是引用类型才能将其用作方法的泛型类型中的参数 T...”
我可以想办法解决这个问题,例如定义 IFactory 而不是 IFactory:
public interface IFactory
{
object GetInstance();
}
但是用户需要自己转换对象:
ITest test = (ITest)ServiceLocator<ITest>.GetInstance();
这相当尴尬并且可能会导致错误(例如未正确转换)
如果有一种写法就更好了:
ITest test = ServiceLocator.GetInstance("ITest") 但还没有弄清楚如何做到这一点。
最佳答案
试试这个:
public interface IFactory<T>
where T: class
{
T GetInstance<T>();
}
这将 T
限制为引用类型。顺便说一下,这是众多可用的之一 generic type constraints .
关于C# 在不知道类型的情况下返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7477708/