2012-04-09 21 views
2

私はC#4.0を使い、動的キーワードを愛用し始めました。しかし、私がやっていることが良い習慣と考えられるかどうかはわかりません。以下のコードをご覧ください:C#ダイナミック型と条件式

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

これを行うには良い方法がありますか?私は上記の方法が非常に簡単であることを発見し、それを使用していましたが、長期的にはそれに固執するべきかどうかはわかりません。

EDIT:.NET 3.5以下、または動的キーワードを使用せずに同じことを行う場合は、どのような実装が適していますか?

ありがとうございます! :)

+0

'as 'の何が問題なのですか? –

+0

アンドリュー:良い点!私はまだC#を学んでいるので、いくつかの非常に重要な概念を忘れることがあります。 –

答えて

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

はしかし、私の好みのオプションは次のとおりです。

TypeOneTypeTwoがそのAPIのメソッドを公開するために、明示的なインターフェイスの実装を使用する場合があります
var typed = theReturnType as ISomeInterface; 
if(typed != null) typed.SomeMethod(); 
else throw new ArgumentException("somethingMeaningful"); 

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

(同様にTypeTwo

ここでdynamicは実際には使用できません。戻り値のタイプがnoob.do(param)の場合、objectは最初の例では問題ありません。つまり、ISomeInterfaceがさらに良いでしょう。

+0

Marc:あなたのフィードバックに感謝します。私は 'theReturnType'オブジェクトが2つの異なるクラスの型である可能性があるため、動的を使用していました。毎日何か新しいことを学ぶのはいいですね:) –

+0

@noobsauceのインターフェースは無関係のクラスにまたがることができます - それは実際には***ポイントの***インターフェースの一部です; p –

+0

マーク:私はあなたのテクニックを実装しました。すごい。これはすばらしいレッスンでした。私はこの質問をしてうれしいです。 –