C# 动态转换类

C# 动态转换类,c#,C#,如图所示,我使用以下代码动态选择base类。我正在将收到的base类转换为相应的类。如果返回的类是BasePlusOne,则此代码将引发异常。有没有更好的方法来处理这种情况?这种方法还有其他缺点吗 class Base { virtual public void FuncA() { MessageBox.Show("10"); } } public class BasePlusOne: Base

如图所示,我使用以下代码动态选择
base
类。我正在将收到的
base
类转换为相应的类。如果返回的类是
BasePlusOne
,则此代码将引发异常。有没有更好的方法来处理这种情况?这种方法还有其他缺点吗

 class Base
    {
        virtual public void FuncA()
        {
            MessageBox.Show("10");
        }
    }

    public class BasePlusOne: Base
    {
        public void Bp1MEthod()
        {
            MessageBox.Show("BasePlusOne");
        }
        override public  void FuncA()
        {
            MessageBox.Show("overridden by BasePlusTwo");
        }
    }


    public class BasePlusTwo : Base
    {
        public void Bp1MEthod()
        {
            MessageBox.Show("BasePlusTwo");
        }
        override public void FuncA()
        {
            MessageBox.Show("overridden by BasePlusTwo");
        }
    }


    public class One
    {
        public Base GetBase(int i )
        {
            if (i == 1)
            {
                return new BasePlusOne();
            }
            else
            {
                 return new BasePlusTwo();
            }
        }
    }


    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            One one = new One();
            Base bp =one.GetBase(2);

            BasePlusOne b = (BasePlusOne)bp;

            b.Bp1MEthod();
            b.FuncA();
        }
    }

除非我大错特错,否则听起来你想用


编辑-我还没有阅读所有的代码。。。。我将使用一个接口来指定策略模式中的公共内容…

您需要将
Bp1MEthod
添加到公共基类(即
base
)。将
baseplusWO
转换为
BasePlusOne
通常会失败


在对象祖先中向上投射(从
Base
BasePlusOne
)是一个坏主意,也是有缺陷设计的强烈暗示。朝另一个方向浇铸是多面体的基本思想。

您可以使用
is
操作符测试对象的类型:

One one = new One();
Base bp =one.GetBase(2);

BasePlusOne b = (BasePlusOne)bp;

b.Bp1MEthod();
b.FuncA();
注意
if
s的顺序。如果类
BasePlusONe
继承了
Base
,则顺序必须类似于obove。如果第一个是
Base
,那么它将由
Base
对象和
BasePlustOno
输入(假设
BasePlusOne:Base
,如我们所说)

回答您的代码

if (obj is BasePlusOne) // this should be first
{
   BaseBlusOne b = obj as BaseBluseOne;
}
else if (obj is Base)
{
   Base b = obj as Base;
}

为了得到一个好的答案,请提供更多关于你想做什么的上下文。编辑问题。请再检查一下。
One one = new One();
Base bp = one.GetBase(2);

if (bp is BasePlusOne)
{
    BasePlusOne b = (BasePlusOne)bp;
    b.Bp1MEthod();
    b.FuncA();
}