3

Web サービスを動的に公開する Microsoft ERP を使用しています。サービスによって生成されるサービスは、当社の管理外です。型定義を含むオブジェクトがどのように作成され、公開されるかについて、私たちは何も言いません。新しいメソッドが Web サービスに追加または削除されると、すべての型の列挙が再番号付けされ、新しい定義に更新した後、Web サービスを使用するすべてのものがホースアップされます。つまり本質的に、

enumeration Type1
  Item1
  Item2
  Item3

...になる可能性があります

enumeration Type6
  Item1
  Item2
  Item3

...列挙型の名前は変更されますが、型のメンバーは静的なままです。このサービスは、XSD.exe を使用してオブジェクトを生成した結果とまったく同じように見えるサービスを出力します。そのため、誰かが (ERP GUI を介して) サービスで新しいメソッドを公開するたびに、オブジェクトが再構築され、タイプがアルファベット順にサービス定義に割り当てられ、再公開されて、コード ベース全体のショットが残ります。

リフレクションを使用して型を判別し、静的メンバーを新しいビジネス オブジェクトに解析しようとしましたが、型の実際の名前を知らずに列挙を型キャストできないため、機能しません。以下は動作しません。

System.Type t = service.BusinessObjectEnumeration.GetType();
service.SomeField = Enum.Parse(t,"Item1");

...列挙型を明示的にキャストしていないため、コンパイラがエラーをスローします。

型を正しい列挙に動的にキャストしながら、この問題を克服する方法はありますか?

繰り返しますが、サービスによって公開されている実際のオブジェクトを変更することはできません。サービスにサブスクライブするコードのみを変更します。

4

3 に答える 3

8

サンプル コードを参照してください。

System.Type t = service.BusinessObjectEnumeration.GetType();
service.SomeField = Enum.Parse(t,"Item1");

おそらくこれを行う方法は、リフレクションを使用することです。

var prop = service.GetType().GetProperty("SomeField");
prop.SetValue(service, Enum.Parse(prop.PropertyType, "Item1"), null);
于 2010-07-04T07:43:18.630 に答える
1

Nav Web サービスでも同様の問題がありました。すべてのサービスに対して単一の Web 参照を作成するのではなく、Nav を介して公開するサービスごとに新しい Web 参照を作成するために使用したソリューション。これにより、リフレクションやハックを使用しなくても、発生している名前の衝突を防ぐことができます。

于 2011-03-02T21:40:33.477 に答える
0

なぜ物事を解析する必要があるのでしょうか?
列挙型を正しく理解していれば、それらは値を渡します (列挙型自体ではありません)。

編集:私が意味するのは、enuma と同じではありませんclass。の場合class、インスタンスが受け渡されることが期待されます。の場合、値enumの形式で渡されるメンバーの 1 つまたは組み合わせです。int

EDIT2:ここでenum何らかの形で使用しようとしてstructいますか?

EDIT3: どのタイプがenumデバッグ モードであるかを確認して、それを反映する方法を理解する必要があります。

object enumValueReturned = service.BusinessObjectEnumeration;

ウォッチenumValueReturnedウィンドウに配置し、リフレクション ( GetMembers) を使用して再生し、どのように に到達するかを確認しますItem1

于 2010-06-21T14:43:25.397 に答える