2

我已经开始使用 C# 4.0 并且喜欢动态关键字。但是,我不确定我在做什么可以被认为是好的做法。请看下面的代码:

static void Main()
{
    NoobSauceObject noob = new NoobsauceObject();

    dynamic theReturnType = noob.do(param);

    if (theReturnType.GetType().ToString().Contains("TypeOne"))
        theReturnType.ExecuteMethodOfTypeOne();
    else if (theReturnType.GetType().ToString().Contains("TypeTwo"))
        theReturnType.ExecuteMethodOfTypeTwo();
    else
        throw new ArgumentException("");
}

有没有更好的方法来做到这一点?我发现上述方法非常简单并且一直在使用它,但不确定从长远来看我是否应该坚持使用它。

编辑:如果我要使用 .NET 3.5 或更低版本或不使用 dynamic 关键字来做同样的事情,那么什么是好的实现?

提前致谢!!:)

4

1 回答 1

6

在我看来,您只是在两种不相关的类型之间进行类型测试。如果可能的话,我会在这里看看多态性,或者至少:实现一个通用接口。但是,以下内容也可以:

var typeOne = theReturnType as TypeOne;
if(typeOne != null) typeOne.ExecuteMethodOfTypeOne();
else {
    var typeTwo = theReturnType as TypeTwo;
    if(typeTwo != null) typeTwo.ExecuteMethodOfTypeTwo();
    else throw new ArgumentException("somethingMeaningful");
}

但是,我的首选选项是:

var typed = theReturnType as ISomeInterface;
if(typed != null) typed.SomeMethod();
else throw new ArgumentException("somethingMeaningful");

在哪里TypeOne并且TypeTwo可能使用显式接口实现在其 API 上公开该方法:

public class TypeOne : ISomeInterface {
    void ISomeInterface.SomeMethod() { ExecuteMethodOfTypeOne(); }
    public void ExecuteMethodOfTypeOne() {
        // ...
    }
}

(同样TypeTwo

我看不出dynamic这里没有真正的用处;对于 , 的返回类型noob.do(param)object在第一个示例中会很好 - 或者ISomeInterface会更好。

于 2012-04-09T06:09:09.407 回答