異なるタイプの配列へのオブジェクトのコピー配列
質問
以前、私は私のASMXのWebサービス間の型定義を共有しようとして問題に走ったと私の.aspxページ(Webクライアント)
C#のオブジェクトの配列と暗黙の型に 私はアドバイスを理解したようASMXプロキシクラスで定義される、「問題」これが作成するには、オブジェクトの新しい配列にクライアントで作成されたオブジェクトの配列をコピーすることによって解決することができます。
私はまだ、この単純な作業で苦労していますC#での新人であること。ここに私のコードの多くの部分が(前回の記事で他のフラグメントは変わりません)次のとおりです:
私は、「テストデータ」を取り込む。ここで、...ここで私は、Webサービスに渡すされます:
// create an array of MetaData objects
MetaData[] nvPairs = new MetaData[20]; // arbitrary length of 20 pairs
// create arbitrary MetaData objects in the array
nvPairs[0] = new MetaData("Grant Number", "2577-9912");
nvPairs[1] = new MetaData("OPEAnalyst", "Simpson");
...ここで私はそのタイプのプロキシバージョンに(私が原因でプロキシを完全に使用することはできません)私のTRIMBrokerUtil名前空間で定義された「本当の」タイプから「コピー」に機能をしようとします:
protected TRIMBrokerASMXProxy.ASMXProxy.MetaData[] CopyMetaData(
MetaData utilArray)
{
TRIMBrokerASMXProxy.ASMXProxy.MetaData[] outArray =
new TRIMBrokerASMXProxy.ASMXProxy.MetaData[utilArray.Name.Length];
int i;
for (i = 0; i < utilArray.Name.Length; i++)
{
outArray[i].Name = utilArray.Name;
outArray[i].Value = utilArray.Value;
}
return outArray;
}
...と私は、この行に(コンパイラフラグ2つのエラーその関数を呼び出そうどこその後、ここにあります:
TRIMBrokerASMXProxy.ASMXProxy.MetaData[] kvData =
CopyMetaData(metaDataArray);
小数点以下のコンパイルエラーの両方とも同じ行に
エラー1のための最良のオーバーロードされたメソッドの試合 '_Default.CopyMetaData(TRIMBrokerUtil.MetaData)' は、いくつかの無効な引数を持っている。
エラー2引数 '1':から変換できません 'TRIMBrokerUtil.MetaData []' 'TRIMBrokerUtil.MetaData'
に私が閉じていますか?
解決
あなたが宣言したあなたのパラメータはMetaData
ではなくMetaData[]
する - 言い換えれば、それは配列ではありません。その後、かなり多くのことをutilArray.Name
を使用しているが、なぜそれが明確ではありません。
私はあなたが実際にしたい疑います:
protected TRIMBrokerASMXProxy.ASMXProxy.MetaData[]
CopyMetaData(MetaData[] utilArray)
{
TRIMBrokerASMXProxy.ASMXProxy.MetaData[] outArray =
new TRIMBrokerASMXProxy.ASMXProxy.MetaData[utilArray.Length];
for (int i = 0; i < utilArray.Length; i++)
{
outArray[i] = new TRIMBrokerASMXProxy.ASMXProxy.MetaData();
outArray[i].Name = utilArray[i].Name;
outArray[i].Value = utilArray[i].Value;
}
return outArray;
}
ところで、あなたは読みこれを容易にするためにusing
ディレクティブを検討する必要があります:
using ProxyMetaData = TRIMBrokerASMXProxy.ASMXProxy.MetaData;
...
protected ProxyMetaData[] CopyMetaData(MetaData[] utilArray)
{
ProxyMetaData[] outArray = new ProxyMetaData[utilArray.Length];
for (int i = 0; i < utilArray.Length; i++)
{
outArray[i] = new ProxyMetaData();
outArray[i].Name = utilArray[i].Name;
outArray[i].Value = utilArray[i].Value;
}
return outArray;
}
別の方法としては、Array.ConvertAll
あります:
ProxyMetaData[] output = Array.ConvertAll(input,
metaData => new ProxyMetaData(metaData.Name, metaData.Value));
あなたがC#3を使用していない場合は、あなたはそのための匿名メソッドを使用することができます。 ProxyMetaData
が適切なコンストラクタを持っていないとあなたがをのC#3を使用している場合は、オブジェクト初期化子を使用することができます:
ProxyMetaData[] output = Array.ConvertAll(input,
metaData => new ProxyMetaData { metaData.Name, metaData.Value });
あなたは、その後、C#2なし適切なコンストラクタで立ち往生している場合:
ProxyMetaData[] output = Array.ConvertAll(input, delegate(MetaData metaData)
{
ProxyMetaData proxy = new ProxyMetaData();
proxy.Name = metaData.Name;
proxy.Value = metaData.Value;
});
私は<全角> のそれはすべての拠点をカバーしていると思う:)
他のヒント
私はこれを行うためにLINQを使用することになります:
TRIMBrokerASMXProxy.ASMXProxy.MetaData[] kvData =
metaDataArray.Select(d =>
new TRIMBrokerASMXProxy.ASMXProxy.MetaData(
d.Name, d.Value)).ToArray();
あなたは.NET 3.5を使用している場合は、また、それはあなたがプロキシを生成するために使用すべきかである、あなたにもWCFを使用できることを意味します。あなたはのDataContract属性とDataMemberを属性で連載されているメンバーとあなたのTRIMBrokerASMXProxy.ASMXProxy.MetaDataの属性タイプをすることができるだろう。その後、あなたは実際の型とのご契約を定義することができ、そしてすべてで変換を実行する必要はありません。
またArray.ConvertAllを使用することができます。私は私に説明してみましょうこれまでyoureのは比較的新しい知っています。これは、2つの一般的なパラメータがあります。それは(私にそれを呼び出すことができます)に変換したいアレイのタイプである第1の1。そしてもう一つは、あなたがに変換するタイプ(Oはそれを呼び出すことができます)。これは、タイプIの配列を受け取り、2番目のパラメータはコンバータデリゲートであるタイプOの配列を返します。我々が持っている命名その署名を適用するようになります。
delegate O Converter(I input);
デリゲートのボディは、変換を行うために必要なコードが含まれている必要があります。 ConvertAll関数内部では、入力配列内の値の各スルーコードの反復とデリゲートに次に渡します。デリゲートによって返される値は、出力アレイに格納されます。出力アレイは、一度すべての値が変換され、ユーザに返されます。
using ProxyMetaData = TRIMBrokerASMXProxy.ASMXProxy.MetaData;
ProxyMetaData[] convertedArray = Array.ConvertAll<MetaData, ProxyMetaData>(utilArray,
delegate(MetaData metaData)
{
ProxyMetaData returnValue = new ProxyMetaData();
returnValue.Name = metaData.Name;
returnValue.Value = metaData.Value;
return returnValue;
});