在switch语句中实例化一个对象,但不能在switch语句的范围之外使用它

fle*_*sod 1 c#

我有一个PDF"窗口贴纸"模板类,我可以用于所有汽车经销商,但这个经销商想要按照自己的方式定制,而不是所有经销商的方式.

因此,我为该特定经销商创建了第二个PDF"Window Sticker"模板类.

然后我发现由于范围问题我无法在任何特定经销商的switch语句中实例化它.它的解决方法或其他方法是什么?

public class Foo1
{
    public Foo1() { }
    public string GeneratePdf() { return "Red"; }
}
public class Foo2
{
    public Foo2() { }
    public string GeneratePdf() { return "Blue"; }
}

Object pdfTemplate;
long dealerAccountId = 121;  //247

switch(dealerAccountId)
{
   case 247:
       pdfTemplate = new Foo2();
       break;
   default:
       pdfTemplate = new Foo1();
       break;
}

string color = pdfTemplate.GeneratePdf();
Run Code Online (Sandbox Code Playgroud)

Pat*_*man 9

问题不在于范围.它是pdfTemplate变量的类型.Object不会削减它.您应该创建一个具有该方法的接口,GeneratePdf并将其用作类型.否则它不知道pdfTemplate变量的可能方法,比如GeneratePdf.

public interface IGenerator
{
    string GeneratePdf();
}

public class Foo1 : IGenerator
{
    public Foo1() { }
    public string GeneratePdf() { return "Red"; }
}
public class Foo2 : IGenerator
{
    public Foo2() { }
    public string GeneratePdf() { return "Blue"; }
}

IGenerator pdfTemplate;
long dealerAccountId = 121;  //247

switch(dealerAccountId)
{
   case 247:
       pdfTemplate = new Foo2();
       break;
   default:
       pdfTemplate = new Foo1();
       break;
}

string color = pdfTemplate.GeneratePdf();
Run Code Online (Sandbox Code Playgroud)

为了让OP了解他的选择dynamic,请不要使用它.

使用时dynamic,它将尝试解析您在运行时调用的方法.编译器不会警告您有关不存在的方法,它只会假设它在运行时存在(换句话说:错误仅在编译后可见,并且可能在发布产品后可见).你不需要一个界面.

dynamic pdfTemplate;

...

string color = pdfTemplate.GeneratePdf();
Run Code Online (Sandbox Code Playgroud)

这只是工作,没有麻烦,只是工作代码.(如果你打错了,请检查一下会发生什么generatepdf())

  • 确实.Downvoting一个有用的帖子,清楚地表明*不使用*是一个有点苛刻的imho. (4认同)
  • @siride因为OP可能不拥有他的`Foo1`和`Foo2`类. (2认同)
  • @siride直到他用C#编程了5年,你认真吗?你怎么可能做出如此全面的陈述? (2认同)
  • @fletchsod:那么这是了解这些事情的好时机.并且不要打扰`dynamic`.您可以使用C#编程您的余生,而无需使用它. (2认同)
  • @fletchsod别担心,只有被删除的评论.问题和答案将保持不变. (2认同)