0

私は2つのオブジェクトを持っています。オブジェクト A とオブジェクト B。

オブジェクト A は、いくつかの XSD ファイルから生成されたクラスのインスタンスです。xsd.exe /c を使用してコンパイルしました。これで、新しいオブジェクトができました。

また、オブジェクト A に非常によく似たものを返す Web サービスもあります。したがって、現在、次のようなものがあります。

WebService.foo myResponseObj = MyService.GetObject(inData);
MyFramework.foo myClientObj = new MyFramework.foo();

やりたいことはこれ

myClientObj = (MyFramework.foo)myResponseObj

しかし、これはあまり好きではありません。「暗黙的に MyFramework.foo[] を WebService.foo[] に変換できません」と言う

これを解決する方法についてのアイデアはありますか? オブジェクトは非常に大きく、基本的に同じです。

4

7 に答える 7

3

指定したキャストを正常に実行するには、両方のオブジェクトが同じインターフェイスから継承する必要があります。両方のクラスで実装できるインターフェイスに必要な共通メソッドを引き出すことを検討するかもしれません。そうすれば、インターフェイス タイプにキャストするだけで、オブジェクト全体ではなくそれらのメソッドだけにアクセスできるようになります。

楽しみ!

于 2010-06-02T18:54:52.913 に答える
3

インターフェイスを抽出して (1 つのクラスを右クリックし、[リファクタリング] -> [インターフェイスの抽出] を選択)、このインターフェイスを両方のクラスに適用するのはどうですか?

したがって、次のようになります。

namespace WebService
{
   public class foo : IExtractedInterface
}

namespace MyFramework
{
   public class foo : IExtractedInterface
}

その後、次のことができるはずです。

IExtractedInterface myClientObj = (IExtractedInterface)myResponseObj;
于 2010-06-02T18:55:33.783 に答える
1

これは基本的にすでに回答済みです。ただし、ここで回答された内容に加えて、.NET4の新しい「タイプの同等性」機能によって提供される希望の小さなちらつきがあることに注意してください。

ただし、C#4は、インターフェイスでの限定された形式の構造型をサポートすることに注意してください。詳細については、 http://blogs.msdn.com/samng/archive/2010/01/24/the-pain-of-deploying-primary-interop-assemblies.aspxを参照してください。

ただし、これはかなり高度な.NET-fooです。

于 2010-06-02T19:03:46.420 に答える
1

標準の wsdl.exe ツールを使用してプロキシとサポート クラスを作成している場合、コードは部分クラスとして生成されると思います。それがあなたの状況である場合は、独自の暗黙的な変換演算子を型の 1 つに挿入できます。たとえば、次のように、ファイル "MyService\foo.cs" で MyService.foo クラスが定義されているとします。

namespace MyService
{
    public partial class foo
    {
        public string PropertyA { get; set; }
        public string PropertyB { get; set; }
        public string PropertyC { get; set; }
        // ...
    }
}

そして、以下のように、ファイル "MyFramework\foo.cs" に MyFramework.foo クラスが定義されています。

namespace MyFramework
{
    public class foo
    {
        public string PropertyA { get; set; }
        public string PropertyB { get; set; }
        public string PropertyC { get; set; }
        // ...
    }
}

次に、別のファイルを作成できます。たとえば、次のように「MyService\foo.conversion.cs」とします。

namespace MyService
{
    partial class foo
    {
        public static implicit operator MyFramework.foo(foo input)
        {
            return new MyFramework.foo
            {
                PropertyA = input.PropertyA,
                PropertyB = input.PropertyB,
                PropertyC = input.PropertyC,
                // ...
            };
        }
    }
}

これにより、MyService.foo オブジェクトを MyFramework.foo オブジェクトであるかのように使用して、ほとんどのコードを記述できるようになります。次のコードは、上記のセットアップでコンパイルされます。

        MyService.foo x = new MyService.foo();

        MyFramework.foo y = x;
于 2010-06-02T19:16:24.647 に答える
1

すべてのプロパティを手動でコピーして、あるクラスを別のクラスに変換するメソッドを作成する必要があります。

その後、 でそのメソッドを呼び出すことができますArray.ConvertAll

于 2010-06-02T18:54:33.723 に答える
1

それらが「基本的に同一」であることは不十分です。型に互換性がある場合、つまり共通の子孫を共有し、実際の型がキャストに有効である場合にのみ、2 つのオブジェクト間でキャストできます。

たとえば、Circleが の子孫である場合、次のように機能しShapeます。

Shape x = new Circle();
Circle y = (Circle)x;

ただし、とがまったく同じフィールドを持っていても、実際には互いに派生していない場合、次のイベントは機能しません。ClassAClassB

ClassA a = new ClassA();
ClassB b = (ClassA)a;

両方に共通のインターフェイスを実装することは価値があるかもしれません。その後、そのインターフェイスにキャストして、必要な方法で使用できます。

于 2010-06-02T18:55:44.087 に答える
0

あなたが与えた引用が示唆する配列である場合、応答コレクションを反復処理し、メンバーオブジェクトをクライアントコレクションに追加する必要があります。

于 2010-06-02T18:57:24.967 に答える