C# 在不知道类型的情况下返回类型

标签 c# generics

我想创建一个可用于依赖注入(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/

相关文章:

swift - 无法检查类型 T : Equatable inside a generic 的值是否相等

c# - 什么是标准的 Akka.Net 消息命令验证模式?

c# - PropertyGrid 和对象的动态类型

java - 了解集合中的 Java 绑定(bind)泛型类型

c# - 为什么 "IQueryable.Where()"在此查询中提供与 "IEnumerable.Where()"不同的结果?

c# - 在长时间运行的进程中禁用 Windows 更新

c# - 尝试添加索引器时如何解决 C# 编译器错误 CS0102?

c# - 如何实现 IEnumerator<T>?

c# - 虚拟泛型方法调用是如何实现的?

c# - 使用 PooledRedisClientManager() 连接到 Ubuntu 虚拟机上的远程 Redis 实例