我有一个方法来调用服务并返回一个响应对象。我需要响应对象中的一些数据。我可以通过在响应之后使用点来访问它们,如:
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();
}
这是gava me XMLData值。
答案 0 :(得分:1)
您可以使用Reflection(System.Reflection命名空间),类似于以下内容(语法可能稍微偏离):
var prop = response.GetType.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance);
foreach (var prop in props)
{
prop.GetValue(response, null);
}
或者使用GetProperty("Name", <bindings>);
这将为您提供所有非公共属性。您可以使用与GetFields方法类似的方法尝试非公共字段。但是,我认为它不允许您访问私有字段。