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以下を使用して、または動的キーワードなしで同じことを行う場合、適切な実装は何でしょうか?

前もって感謝します!!:)

4

1 に答える 1

6

無関係な2つのタイプ間でタイプテストを行っているように見えます。可能であれば、ここでポリモーフィズムを検討します。少なくとも、共通のインターフェースを実装します。ただし、以下も問題ありません。

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");

ここでTypeOneTypeTwo明示的なインターフェース実装を使用して、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 に答える