2

私は本当にこの問題に行き詰まっています: クラスBigStorage にいくつかのデータがあり、GUI にいくつかの操作があります。このクラスから Web サービスにデータを渡し、回答を受け取って処理する必要があります。

この BigStorage クラス定義を含む dll をコンパイルし、それを Web マスターに渡しました。彼はこのクラスを使用し、結果を返しました。しかし、私はこの結果を として受け取りました webRefName.BigStorage。これは myBigStorageとは異なります (名前空間が異なります)。

ちなみに、これの 1 つのプライベート フィールドwebRefName.BigStoragetypeof DataSet(?!) であり、BigStorage に独自に定義された型があります (xml シリアル化を追加しました)。

次のようなことをする方法はありますか?

webRefName.BigStorage bS = (webRefName.BigStorage) bSfromLocalProject;
 //where  bSfromLocalProject typeof BigStorage

また、なぜ Reference.cs のこのフィールド (上記参照) が DataSet なのですか?

4

2 に答える 2

3

Web 参照から生成された型は、利用可能なメタデータ (wsdl) から生成された浅いプロキシ型です。これらは元のタイプと同じではなく、互換的に使用することはできません。名前空間は Web 参照のプロパティの一部として構成できますが、同じにすると機能しません。

反対側で元のアセンブリを使用している場合は、Web サービス参照(つまり、WCF) の使用を検討してください。これには、既存の型を再利用するオプションがあります。つまり、既存の dll 参照の型を使用できます。次に、それらは完全に交換可能です(または、より正確には、それらは同じものです-したがって、交換するものは何もありません)。

于 2012-08-02T12:12:33.553 に答える
0

C# では、(既定では) 異なる型を互いにキャストすることはできません。ただし、アクセスできるクラスで変換操作を定義できます。Web 参照クラスにアクセスできる場合、自動生成されたクラスは部分的である必要があり、それを拡張できます。ライブラリにアクセスできる場合は、それに変換操作メソッドを追加します (ライブラリに対してこれを行うことはお勧めしませんが、Web 参照クラスに対して行うことをお勧めします)。

基本的に、質問で提供したようなコードを使用できるようにするには、ソースまたは宛先クラスで明示的または暗黙的な変換を定義します。

MSDN への参照:明示的なキャスト暗黙的なキャスト
あなたの場合、この変換はデータ損失の傾向がないため、暗黙のキャストの方が適しているようです。

これは次のようになります。

namespace webRefName {
    public partial class BigSorage {
        public static implicit operator BigStorage(otherNamespace.BigStorage otherBigStorage) {
            //write conversion code from otherBigStorage to webRefName.BigStorage.
            //return the resulting webRefName.BigStorage.
        }
    }
}

ところで、パーシャルは別のアセンブリで定義できないため、このコードは Web サービスを参照する同じアセンブリに存在する必要があります。

その後、あなたが求めたものを書くことができます(明示的なキャストがなくても):

webRefName.BigStorage bS = bSfromLocalProject;

これが役立つことを願っています!
テンギズ

于 2012-08-02T12:27:07.787 に答える