【问题标题】:Way to use different constructors on same variable based on switch-case outcome基于 switch-case 结果在同一变量上使用不同构造函数的方法
【发布时间】:2018-08-27 12:06:55
【问题描述】:

考虑这段代码:

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

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

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

我不想重复编写后续代码,这就是为什么我认为我可以做一些类似于所示代码的事情。

【问题讨论】:

  • switch之前声明变量:var myExporter;,然后在cases内myExporter =
  • 您希望它是哪种类型?
  • var Exporter 如果不给它我猜的类型,也不会编译。
  • 哦,那你可能需要使用一个共同的祖先类型而不是var
  • 如果使用 myExporter 的代码相同,那么我猜你的 PngExporter 和你的 SvgExporter 都实现了相同的接口。因此,只需在切换之前定义“IInterface myExporter”...

标签: c# switch-statement


【解决方案1】:

如果这两种类型继承自同一个基类/接口,那么:

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的设计模式,所以我建议阅读它。

【讨论】:

  • 谢谢,一定要查一下,他们都是 Oxyplot 的情节出口商。但这正是我想要的!
  • 关于 If-else 解决方案:在我的情况下,我实际上有 3 个案例,所以 if-else 仍然可以接受。不过,我很好奇这个问题的一般解决方案。
  • @RolandDeschain - 很高兴这有帮助。还可以查看工厂设计模式
猜你喜欢
  • 2021-01-22
  • 2013-07-10
  • 2016-06-08
  • 2016-04-08
  • 2017-07-16
  • 2019-10-19
  • 2019-11-27
  • 2013-09-11
  • 1970-01-01
相关资源
最近更新 更多