基于切换案例结果在同一变量上使用不同构造函数的方法

时间:2018-08-27 12:06:56

标签: c# switch-statement

考虑以下代码:

switch(formatindex)
{
    case 0:
      var myExporter = new PngExporter { Background = OxyColors.Black };
      fileExtension = ".jpg";
    case 1:
      var myExporter = new SvgExporter();
      fileExtension = ".svg";
}

这当然不会编译,因为我两次声明了myExporter。 问题是,是否有一种巧妙的方法可以根据转换案例的结果来选择类型/构造函数。

在我的情况下(这引起了这个问题),无论选择哪种类型,使用myExporter的其余代码都是相同的,因为只有所使用的属性是width和height,并且它们的行为都相同两种类型的出口商的方式。

我不想编写两次后续代码,这就是为什么我认为我可以做与所示代码相似的事情的原因。

1 个答案:

答案 0 :(得分:4)

如果两种类型都继承自相同的基类/接口,则:

BaseTypeClass myExporter;
switch(formatindex)
{
    case 0:
      myExporter = new PngExporter { Background = OxyColors.Black };
      fileExtension = ".jpg";
    case 1:
      myExporter = new SvgExporter();
      fileExtension = ".svg";
}

如果您不能为两者添加一个共同的祖先,则可以考虑创建具有此特征的包装器。


在任何情况下,只要是您考虑使用if-else的两种情况:

BaseTypeClass myExporter;
if (formatindex == 0)
{
      myExporter = new PngExporter { Background = OxyColors.Black };
      fileExtension = ".jpg";
}
else
{
      myExporter = new SvgExporter();
      fileExtension = ".svg";
}

通常,这种功能与Factory的设计模式相匹配,因此我建议您仔细阅读它。