我正在填充具有很多属性的对象,然后我只打印它们。 填充过程是在库中完成的,这意味着我无法控制它。
var response = await _api.Campaigns.UpdateAsync(campaignId, campaign);
return Ok(response);
此response
的类型为Campaign
。在其所有属性中,有一个称为Links
。我想做的是,我想从Link
中删除该response
属性,然后返回response
。但是我只是发现无法从对象中删除属性(如果我错了,请纠正我)。
所以我想也许我可以使用foreach循环将所需的属性复制到一个新对象中,然后最终将其返回。所以我尝试了这个,
var response = await _api.Campaigns.UpdateAsync(campaignId, campaign);
var result = new Dictionary<string, object>();
foreach (PropertyInfo info in response.GetType().GetProperties())
result.Add(info.Name, info.GetMethod);
return Ok(result);
对于这种事情,我不是专家,但是当然,它仅提供属性名称及其信息。所以它的输出看起来像这样
"ArchiveUrl": {
"Name": "get_ArchiveUrl",
"AssemblyName": "***",
"ClassName": "MailChimp.Net.Models.Campaign",
"Signature": "System.String get_ArchiveUrl()",
"Signature2": "System.String get_ArchiveUrl()",
"MemberType": 8,
"GenericArguments": null
},
"LongArchiveUrl": {
"Name": "get_LongArchiveUrl",
"AssemblyName": "***",
"ClassName": "MailChimp.Net.Models.Campaign",
"Signature": "System.String get_LongArchiveUrl()",
"Signature2": "System.String get_LongArchiveUrl()",
"MemberType": 8,
"GenericArguments": null
},
"ContentType": {
"Name": "get_ContentType",
"AssemblyName": "***",
"ClassName": "MailChimp.Net.Models.Campaign",
"Signature": "System.String get_ContentType()",
"Signature2": "System.String get_ContentType()",
"MemberType": 8,
"GenericArguments": null
},
但是输出应该是这样的
"archive_url": "***",
"long_archive_url": "***",
"content_type": "template",
"create_time": "2018-06-28T15:30:50+06:00",
"delivery_status": {
"enabled": false,
"can_cancel": false,
"status": null,
"emails_sent": 0,
"emails_canceled": 0
},
"rss_opts": null,
"social_card": {
"image_url": "*|BRAND:LOGO|*",
"description": "",
"title": ""
},
那么最好的方法是什么?
答案 0 :(得分:1)
我认为您正在寻找PropertyInfo.GetValue。
foreach (PropertyInfo info in response.GetType().GetProperties())
result.Add(info.Name, info.GetValue(response));
PS:如果您只想获取公共属性
foreach (PropertyInfo info in response.GetType().GetProperties(BindingFlags.Public))
result.Add(info.Name, info.GetValue(response));
答案 1 :(得分:0)
输出的问题是您将返回info.GetMethod
而不是info.Value(response)
。但是,我建议使用其他方法仅返回某些属性。使用所需的属性创建新类,然后将其返回。例如:
public class SimpleCampaign
{
public string ArchiveUrl { set; set; }
public string LongArchiveUrl { get; set; }
//etc. choosing only the properties you need
}
然后:
var simpleResponse = new SimpleCampaign
{
ArchiveUrl = response.ArchiveUrl,
LongArchiveUrl = response.LongArchiveUrl,
//etc.
}
return Ok(simpleResponse);
当然,编写从一个对象映射到另一个对象的代码在背面很痛苦。但是那里有图书馆可以提供帮助。我建议使用AutoMapper,它是一个Nuget package,非常易于使用,可以自动完成所有映射。