C# 在工厂方法中使用匹配模式(开关)的最佳方法是什么

C# 在工厂方法中使用匹配模式(开关)的最佳方法是什么,c#,switch-statement,factory-method,C#,Switch Statement,Factory Method,我想使用如下构造创建对象: IProduct product1 = creator.CreateProduct<ConcreteProduct1>(); IProduct product2 = creator.CreateProduct<ConcreteProduct2>(); public T CreateProduct<T>() where T: IProduct, new() { switch (typeof(T

我想使用如下构造创建对象:

IProduct product1 = creator.CreateProduct<ConcreteProduct1>();
IProduct product2 = creator.CreateProduct<ConcreteProduct2>();
public T CreateProduct<T>()
        where T: IProduct, new()
    {
        switch (typeof(T))
        {
            case(...) return new ConcreteProduct1;
            case(...) return new ConcreteProduct2;
        }
    }
public static class Factory
{
  public static T Create<T>() where T : class
  {
    return Activator.CreateInstance(ImplementationOf<T>()) as T;
  }

  public static Type ImplementationOf<T>()
  {
    // Concrete types registration
    var map = new Dictionary<Type, Type>()
    {
      [typeof(IArticle)] = typeof(ConcreteArticle1),
      [typeof(IProduct)] = typeof(ConcreteProduct2)
    }


    return map[typeof(T)];
  }
}
但所有这些都不起作用

我应该在case语句中使用什么表达式? 或者我有什么其他的选择来实现这个方法

如果ConcreteProduct1和ConcreteProduct2类实现IPProduct接口,则不需要任何开关表达式,只需返回一个新实例,因为您已将所需类型作为泛型类型参数t和无参数构造函数的泛型类型约束传递

公共产品 其中T:IProduct,new { 返回新的T; }
当我们想要实现应用程序组件之间的松耦合,并且只操作接口而不知道当前实例化了哪个实现时,这样做是有用的。例如,假设我们有以下接口:

interface IProduct
{
}

interface IArticle
{
}

假设这些接口具有以下实现:

class ConcreteProduct1: IProduct
{
}

class ConcreteProduct2: IProduct
{ 
}

class ConcreteArticle1: IArticle
{
}

class ConcreteArticle2: IArticle
{
}
现在,在代码库的客户机部分,我们希望在不知道当前实例化了哪个实现的情况下操作IArticle和ipproduct,例如:

static void Main()
{
  var article = Factory.Create<IArticle>();
  var product = Factory.Create<IProduct>();
}

这里,Factory.ImplementationOf方法包含接口和运行时使用的具体类型之间的映射。而且,在将来,如果我们想切换到接口的另一个实现,比如ConcreteArticle2 for IArticle,我们只需要修改这个方法,而不需要接触客户端代码。

@Artem Altukhov它回答了你的问题吗?是的,它帮助我解决了根据类型创建对象的问题。非常感谢。但是,在这种情况下如何使用开关?在这种特殊情况下,您不需要开关。在更复杂的场景中可能需要它,我明白了,但我真的想知道它是如何工作的,不是在这个场景中,而是在未来的场景中,你可以找到一个基本的指南
public static class Factory
{
  public static T Create<T>() where T : class
  {
    return Activator.CreateInstance(ImplementationOf<T>()) as T;
  }

  public static Type ImplementationOf<T>()
  {
    // Concrete types registration
    var map = new Dictionary<Type, Type>()
    {
      [typeof(IArticle)] = typeof(ConcreteArticle1),
      [typeof(IProduct)] = typeof(ConcreteProduct2)
    }


    return map[typeof(T)];
  }
}