我正在尝试创建一个可以接受类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();
}
}
}
}
答案 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
,如果是Child1
,Child2
或Child3
。