从对象获取特定属性

时间:2018-06-29 10:10:02

标签: c#

我正在填充具有很多属性的对象,然后我只打印它们。 填充过程是在库中完成的,这意味着我无法控制它。

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": ""
},  

那么最好的方法是什么?

2 个答案:

答案 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,非常易于使用,可以自动完成所有映射。