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

时间:2010-03-18 17:35:36

标签: c# inheritance polymorphism

我有一个简单的继承heirarchy,MyType2继承自MyType1

我有一个MyType1arg的实例,作为方法的参数传入。如果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;
}

3 个答案:

答案 0 :(得分:5)

请注意,“是”和“as”是重复测试; 要么使用is,然后(一旦你知道)只是施放 - 首先使用as并测试null

重新解决你的问题;如果你只想做一件事 - 然后施展:

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

否则 - 可能是一个virtual方法(在基类型上),或者只是将逻辑重构为另一个方法,所以你有:

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

persoanlly ,我只是使用额外的变量:

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

答案 1 :(得分:2)

没有;你需要创建一个单独的变量。

Also, your code performs more casts than necessary; it would be a little bit faster like this:

MyType2 b = arg as MyType2;
if(b != null)
{
    //Use b 
}

答案 2 :(得分:1)

我想说选项1是将所有修改代码(您的注释行)作为MyType2的函数,然后对其进行(arg as MyType2).Foo()

选项2是在MyType1上实现MyMethod,在MyType2中实现覆盖,只需调用它而不用担心。 MyType1实现可能什么都不做,这不是最好的设计。

编辑:技术上不违反LSP,因为这只适用于这种情况的反面(MyType2不应该破坏MyType1的行为)。