私はC#でAPIを使っていくつかのクラスを以下のように使っています。 MessageA
とMessageB
という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の記事やチュートリアルなどにリンクさせてください。助けてくれてありがとう。
あなたは 'Tを使用してみましたあなたのメソッドシグネチャの 'Field'ではなく' field'ですか?キャストの必要性を軽減します。 – drharris
良い点はそれを単純化しますが、問題は解決しません。ありがとう。 –