c#返回一个类型而不需要知道它

本文关键字:不需要 类型 一个 返回 | 更新日期: 2023-09-27 18:08:59

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

例如,假设我有一个名为ServiceLocator的静态类。应用程序可以使用:
ITest test = ServiceLocator<ITest>.GetInstance()

获取实现ittest接口的对象。

为了实现这个,我首先创建了一个Interface IFactory
public interface IFactory<T>
{
   T GetInstance<T>();
}

然后,例如,一个具体的ittest实现看起来像这样:

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"),但还没有弄清楚如何做到这一点

c#返回一个类型而不需要知道它

试试这个:

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

这将T限制为引用类型。顺便说一下,这是许多可用的泛型类型约束之一。