0

サービスを呼び出して応答オブジェクトを返すメソッドがあります。応答オブジェクトにいくつかのデータが必要です。次のような応答の後にドットを付けることで、それらにアクセスできます。

  CVAResponse response = new CVAResponse();
              response = dataExchange.AddOrder(Username, Password, order);
              OrderId= response.Data;

応答オブジェクトには、それらの値が必要であり、(応答ドット)を使用してアクセスできないフィールドがあり、デバッグ中に応答オブジェクトを見ると応答の根がありません。彼らはこの名前のスペースの中にあり、次のようなベースです

  • BookClassLibrary.DataService.CVAOrderResponse

    -ベース

どうすればそれにアクセスできますか? (レスポンスオブジェクトの後にドットをつけてみましたが、こんなものはありません)

CVAResponse クラスは別の会社によって記述されており、定義に進むと、次のように表示されます。

  public partial class CVAResponse : object,System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {

    [System.NonSerializedAttribute()]
    private System.Runtime.Serialization.ExtensionDataObject extensionDataField;

    [System.Runtime.Serialization.OptionalFieldAttribute()]
    private string DataField;

    [System.Runtime.Serialization.OptionalFieldAttribute()]
    private string ErrorMessageField;

    [System.Runtime.Serialization.OptionalFieldAttribute()]
    private BlueBookClassLibrary.DataExchangeService.eCVAResponseStatus StatusField;

    [System.Runtime.Serialization.OptionalFieldAttribute()]
    private string TicketIdField;

    [global::System.ComponentModel.BrowsableAttribute(false)]
    public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
        get {
            return this.extensionDataField;
        }
        set {
            this.extensionDataField = value;
        }
    }

また、この部分クラスがあります:

      public partial class CVAOrderResponse : BlueBookClassLibrary.DataExchangeService.CVAResponse {

    [System.Runtime.Serialization.OptionalFieldAttribute()]
    private string XMLDataField;

    [System.Runtime.Serialization.DataMemberAttribute()]
    public string XMLData {
        get {
            return this.XMLDataField;
        }
        set {
            if ((object.ReferenceEquals(this.XMLDataField, value) != true)) {
                this.XMLDataField = value;
                this.RaisePropertyChanged("XMLData");
            }
        }
    }
}

XMLDataField の値が必要です。またはXMLData。

次のようにリフレクションを使用して解決できます。

         var properties = response2.GetType().GetProperties();


            foreach (var property in properties)
            {
                string name = property.Name;
                object value=  property.GetValue(response2, null);
                if (name == "XMLData")
                    xml = value.ToString();

            }

これにより、XMLData 値が得られました。

4

1 に答える 1

1

次のようなリフレクション (System.Reflection 名前空間) を使用できます (構文が少しずれている可能性があります)。

var prop = response.GetType.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance);
foreach (var prop in props)
{
    prop.GetValue(response, null);
}

またはGetProperty("Name", <bindings>);これを使用すると、すべての非公開プロパティが取得されます。GetFields メソッドで同様のアプローチを使用して、非パブリック フィールドを試すことができます。ただし、プライベートフィールドにアクセスできるとは思いません。

于 2013-07-01T16:31:08.720 に答える