質問
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");
...列挙を明示的にキャストしていないため、コンパイラがエラーをスローするので。
タイプを正しい列挙に動的にキャストしながら、この問題を克服する方法はありますか?
繰り返しますが、サービスによって公開された実際のオブジェクトを変更することはできません。コードのみがサービスに登録しています。
ありがとう、ジョージ
解決
例のコードを繰り返します:
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);
他のヒント
NAV Webサービスにも同様の問題がありました。私が使用していたソリューションは、すべてのサービスに対して単一のサービスではなく、NAVを介して公開する各サービスの新しいWebリファレンスを作成しました。これにより、反射やハッキングを使用せずに発生している名前の衝突が防止されます。
なぜ物事を解析する必要があるのですか?
列挙を正しく理解している場合、それらは値を渡します(列挙自体ではありません)。
編集:私が意味するのは、 enum
aと同じではありません class
. 。のために class
, 、インスタンスが合格/受信されることを期待しています。のために enum
, 、それはメンバーの1つまたは組み合わせであり、それは int
価値。
edit2:使用しようとしていますか enum
ある種のように struct
ここ?
edit3:あなたはどのタイプであるかを確認する必要があります enum
デバッグモードでは、それを反映する方法を把握します。
object enumValueReturned = service.BusinessObjectEnumeration;
置く enumValueReturned
witch windowで、リフレクションを使用してそれを再生します(GetMembers
)見るために、どのように到達しますか Item1
.