我有一个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();
答案 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;
其余代码没问题。
希望这会有所帮助......