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

时间:2015-07-07 14:48:24

标签: 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();

3 个答案:

答案 0 :(得分:9)

问题不在于范围。它是您的pdfTemplate变量的类型。 Object不会削减它。您应该创建一个具有GeneratePdf方法的interface并将其用作类型。否则,它不知道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时,它会尝试解析您在运行时调用的方法。编译器不会警告您有关不存在的方法,它只会假设它在运行时存在(换句话说:错误仅在编译后可见,并且可能在发布产品后可见)。你不需要一个接口。

dynamic pdfTemplate;

...

string color = pdfTemplate.GeneratePdf();

这只是工作,没有麻烦,只是工作代码。 (如果输入错误,请查看会发生什么,例如generatepdf()

答案 1 :(得分:3)

问题是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();

答案 2 :(得分:-1)

试试这个:

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;

其余代码没问题。

希望这会有所帮助......