C#返回一个类型而不必知道它

时间:2011-09-19 21:49:16

标签: c# generics

我想创建一个可用于依赖注入的工厂对象字典。

例如,假设我有一个名为ServiceLocator的静态类。应用程序可以使用:

ITest test = ServiceLocator<ITest>.GetInstance()

获取实现ITest接口的对象。

为了实现这一点,我首先创建了一个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”),但还没弄明白该怎么做。

1 个答案:

答案 0 :(得分:5)

试试这个:

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

这会将T约束为引用类型。顺便说一句,这是许多可用的generic type constraints之一。