c# - 如何在 C# 中将实例变量视为另一种类型的实例

标签 c# inheritance polymorphism

我有一个简单的继承层次结构,MyType2 继承自 MyType1

我有一个 MyType1 的实例,arg,作为参数传入一个方法。如果 argMyType2 的实例,那么我想执行一些逻辑,转换实例。我的代码类似于下面的代码。

必须创建一个新的局部变量 b 感觉很不优雅 - 有没有一种方法可以在不使用额外的局部变量的情况下实现相同的行为?

public MyType1 MyMethod(MyType1 arg) 
{
    if(arg is MyType2)
    {
        MyType2 b = arg as MyType2;
        //use b (which modifies "arg" as "b" is a reference to it)...
    }

    return arg;
}

最佳答案

请注意,“is”和“as”是重复测试; 或者使用is然后(一旦你知道)就施放 - 或者首先使用as然后测试对于 null

关于您的问题;如果你只想做一件事 - 然后投:

if(arg is MyType2)
{
    ((MyType2)arg).SomeSpecialMethod();
}

否则 - 也许是一个虚拟方法(在基本类型上),或者只是将逻辑重构到另一个方法中,所以你有:

if(arg is MyType2)
{
    StuffThatTakesType2((MyType2)arg);
}

但是个人,我只是使用额外的变量:

MyType2 whatever = arg as MyType2;
if(whatever != null) {
    whatever.Foo = 123;
    whatever.Bar();
}

关于c# - 如何在 C# 中将实例变量视为另一种类型的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2472079/

相关文章:

c# - 如何根据 gridview 中的列值制作组(部分)?

javascript - 从 Typescript 中的基类创建子类的新实例

c++ - 从父类(super class)调用子类的方法

java - 对这个简单的多态性例子感到困惑

namespaces - 具有多态关系的命名空间 Laravel 5

c++ - 如何将值复制到另一种类

C# XAML : UI not update after change an instance of ObservableCollection

C# DataSet CheckBox 列与 DevExpress DataGrid

c# - 如何允许 ComboBox 具有不在 ItemsSource 中的选定值?

java - 从父类获取子类名