如果BYPH912Z、byph912zslipno、byph912zprdtcode继承自同一个父类(如BYPH),可以使用抽取方法。
if (this.radioButton1.Checked.ToString().ToLower()=="true")
{
BYPH b912z = new BYPH912Z();
XXXX(b912z);
}private void XXXX(BYPH b912z)
{
b912z.SetDataSource(dt);
report rpt = new report();
rpt.SetReportSouce(b912z);
rpt.Show();
}或者将上面的XXXX封装到父类里,之所以使用父类而不是接口是考虑父类可以重用代码。
if (this.radioButton1.Checked.ToString().ToLower()=="true")
{
BYPH b912z = new BYPH912Z();
b912z.XXXX(dt);
}
......
class BYPH
{
    public void XXXX(? dt)
    {
        this.SetDataSource(dt);
        report rpt = new report();
        rpt.SetReportSouce(this);
        rpt.Show();
    }
}当然使用父类也有一定的危险性,增加一个不支持XXXX()方法的子类是不可能的,如果有这种可能的话可以考虑使用composite模式……,写起来比较麻烦,需要的话可以参考以下《DP》活者《head first design patterns》

解决方案 »

  1.   

    呵呵,有点意思,比较典型的OO问题,利用反射和多态可以实现:
    public class B
        {
            public virtual void SetReportSouce(DataTable dt)
            {
            }
        }    public class B1 : B
        {
            public override void SetReportSouce(DataTable dt)
            {
            }
        }    public class B2 : B
        {
            public override void SetReportSouce(DataTable dt)
            {
            }
        }
    =====================================
    public void TestMethod(string className)
            {
                Assembly assembly = Assembly.Load("NameSpace");
                Type type = assembly.GetType(className);            B b = (B)Activator.CreateInstance(type);
                b.SetReportSouce(dt);
                report rpt = new report();
                rpt.SetReportSouce(b);
                rpt.Show();
            }
    然后根据不同的情况,把命名空间 + 不同的类名作为参数,传到上面的方法。
    这样调用:TestMethod("NameSpace.B1")
    TestMethod("NameSpace.B2")