尝试强制转换为子类型,如果它不起作用,则转换为其他子类型c#

时间:2018-02-14 19:08:33

标签: c# inheritance

我正在尝试创建一个可以接受类Parent的参数的函数,该类实际上是Child1,Child2或Child3类型。我想根据它的哪种子类型做一些不同的事情,除了我在下面展示的内容外,我想不出办法。这对我来说是错误的,所以任何有关更好的方法的建议都会非常感激。

public static bool DoStuff(Parent parent)
{
    try
    {
        Child1 child = parent as Child1;
        DoStuffChild1(child);
    }
    catch (Exception)
    {
        try
        {
            Child2 child = parent as Child2;
            DoStuffChild2(child);
        }
        catch(Exception)
        {
            try
            {
                Child3 child = parent as Child3;
                DoStuffChild3(child);
            }
            catch (Exception)
            {
                HandleError();
            }
        }
    }
}

3 个答案:

答案 0 :(得分:2)

您只需使用is关键字:

public static bool DoStuff(Parent parent)
{
            try
            {
                if (parent is Child1)
                {
                    Child1 child = parent;
                    DoStuffChild1(child);
                }
                else if (parent is Child2)
                {
                    Child2 child = parent;
                    DoStuffChild2(child);
                }
                else if (parent is Child3)
                {
                    Child3 child = parent;
                    DoStuffChild3(child);
                }
            }
            catch (Exception)
            {
                HandleError();
            }
}
  如果实例位于继承树中,则

返回true。

此外,以下是关于类型检查的非常好的答案: https://stackoverflow.com/a/983061/4222487

答案 1 :(得分:1)

如果您使用的是C#7.0或更高版本,则可以使用以下代码实现您正在寻找的内容:

if (parent is Child1 child1)
{
    DoStuffChild1(child1);
}
else if (parent is Child2 child2)
{
    DoStuffChild2(child2);
}

希望这有帮助。

答案 2 :(得分:-1)

如果C#7不是选项,则此方法适用于旧版本的C#。

不要使用try / catch作为控制流程。如初。

如果您需要根据对象的类别执行不同的操作,可以使用typeof.GetType()。在你的例子中

public static bool DoStuff(Parent parent)
{
    if (parent.GetType() == typeof(Child1))
    {
        Child1 child = parent as Child1;
        DoStuffChild1(child);
    }
    else if (parent.GetType() == typeof(Child2))
    {
        Child2 child = parent as Child2;
        DoStuffChild2(child);
    }
    else if (parent.GetType() == typeof(Child3))
    {
        Child3 child = parent as Child3;
        DoStuffChild3(child);
    }
    else
    {
        HandleError();
    }
}

是一种处理它的简单方法。

你在FaizanRabbani的答案中使用is关键字的原因是这个方法是一种严格的类型检查,忽略了超类 - 例如:

if (parent is Parent)

会评估true,但

if (parent.GetType() == typeof(Parent))
例如,

会评估false,如果是Child1Child2Child3