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

本文关键字:语句 switch 作用域 但不能 实例化 一个对象 | 更新日期: 2023-09-27 18:01:28

我有一个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();

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

问题不在于范围。它是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();

为了让OP理解他对dynamic的选择,请不要使用这个

当使用dynamic时,它将尝试在运行时解析您调用的方法。编译器不会警告您一个不存在的方法,它只会假设它在运行时存在(换句话说:bug只在编译后可见,可能在发布产品后可见)。你不需要接口。

dynamic pdfTemplate;
...
string color = pdfTemplate.GeneratePdf();

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

问题是pdfTemplate类型为object,而object类型没有GeneratePdf()方法。即使您分配给变量的对象是Foo1/Foo2类型之一,变量本身的类型也是object。这很重要。

变量必须是具有GeneratePdf()方法的类型。看起来两个Foo类至少都有这个方法。这意味着它们既可以继承相同的基类,也可以实现相同的接口。我推荐后者。所以你会有这个:

public interface IFoo 
{
    string GeneratePdf();
}
public class Foo1 : IFoo
{
    public Foo1() { }
    public string GeneratePdf() { return "Red"; }
}
public class Foo2 : IFoo
{
    public Foo2() { }
    public string GeneratePdf() { return "Blue"; }
}
IFoo pdfTemplate;
long dealerAccountId = 121;  //247
switch(dealerAccountId)
{
   case 247:
       pdfTemplate = new Foo2();
       break;
   default:
       pdfTemplate = new Foo1();
       break;
}
string color = pdfTemplate.GeneratePdf();

试试这个:

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

同样,修改这一行:

Object pdfTemplate

这:

FooBase pdfTemplate;

剩下的代码可以了。