2011-07-29 14 views
4

私はC#でAPIを使っていくつかのクラスを以下のように使っています。 MessageAMessageBという2つのメッセージクラスと、いくつかのフィールドクラスFieldA,FieldBなどがあります。フィールドクラスはすべて、ベースクラスFieldに属しています。条件文を使用したC#汎用型パラメータ

メッセージは

msgA.getField(FieldX field)

msgAからfieldにコピーFieldXエントリ(存在する場合))と

msgB.set(FieldX field)としてアクセスすることができる様々なフィールドを含むであろう。

msgA.isSetField(FieldX field)

メッセージはタイプFieldXのフィールドが含まれていることを確認することもあります。

MessageAを取得し、一部のフィールドをMessageBにコピーする方法を記述する必要があります。私は今働い機能を持っているが、それは

FieldX fieldX = new FieldX(); 
if(msgA.isSetField(fieldX)) 
{ 
    msgA.getField(fieldX); 
    msgB.set(fieldX); 
} 

これは私には愚かな思えるような文の全体の束を持っているので、私はこれを行うための別の方法を書きたいと思います。私はC#とジェネリック型の新機能ですので、それを実行する最善の方法ではありません。多くのことを試した後、私は書いた

private void SetMessageB<T>(MessageA msgA, MessageB msgB, Field field) where T : Field 
{ 
    var field_t = field as T; 
    if (field_t != null) 
    { 
     if (msgA.isSetField(field_t)) 
     { 
      msgA.getField(field_t); 
      msgB.set(field_t); 
     } 
    } 
} 

しかし、これは動作しません。内部の条件文の中で、field_tのタイプはintに変換されます。これは意味がありますなぜこれが起こるでしょう(つまり、これらの関数は引数として型を取ることができないので、コンパイラは毎回動作するとは確信できません)。しかし、誰かが問題を解決する良い方法を指摘できるかどうかは疑問だ。私をMSDNの記事やチュートリアルなどにリンクさせてください。助けてくれてありがとう。

+0

あなたは 'Tを使用してみましたあなたのメソッドシグネチャの 'Field'ではなく' field'ですか?キャストの必要性を軽減します。 – drharris

+0

良い点はそれを単純化しますが、問題は解決しません。ありがとう。 –

答えて

3

それは、あなたのメッセージオブジェクトのメソッドが同様にジェネリックであれば、ここでジェネリックを使用するように理にかなって:

class Message 
{ 
    bool isSetField<TField>(TField field) where TField : Field { ... } 
    void getField<TField>(TField field) where TField : Field { ... } 
    void set<TField>(TField field) where TField : Field { ... } 
} 

次に、あなたの方法は本当に一般的なことができます:

private void SetMessageB<T>(Message msgA, Message msgB, T field) where T : Field 
{ 
    if (msgA.isSetField(field)) 
    { 
     msgA.getField(field); 
     msgB.set(field); 
    } 
} 
+0

ああ、これは理にかなっています。私はこれをどのように達成するかについてのアイデアはありますか?私もリストを作ることを考えました、新しい 'FieldX'の束を加えましたが、同様の問題がありました。 –

+0

あなたは正確に何を達成したいのかについてより詳細な情報を提供する必要があります。混合フィールドタイプのリストでは、キャストに頼らざるを得ません。 –

+0

私はちょうど私の方法を少しきれいにしたいと思います。今は約20件のステートメントがありますので、反復性を低くする方法があるはずです。しかし、何かを試すたびに(たとえば、別のメソッドに渡すか、混合型のリストを使用するなど)、フィールドはすべて異なるタイプなので問題が発生します。私は、このセットアップを一度だけ書くことができる構造があると仮定しています。私はそれが何であるか分かりません。 –

関連する問題