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 的值。或 XML 数据。

它可以通过使用反射来解决,如下所示:

         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 回答