Skip to main content
 首页 » 编程设计

c#之从 Web 方法动态返回字段

2024年02月25日37开发

我有一个 WebAPI 服务,我想允许用户指定他们想要返回的字段。例如,假设我有以下 Person 类:

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 
} 

并且调用 /api/people/ 返回所有人的所有三个字段。我如何处理像 /api/people?fields=FirstName,Email 这样的请求,只为所有人返回这两个字段?如果我可以将诸如 first_name 之类的内容映射到 FirstName ,则可加分,但这不是必需的。

请您参考如下方法:

这是 Dynamic Language Runtime 的工作特别是 ExpandoObject ,由此您只返回您需要的属性在运行时确定:

public dynamic GetPerson() 
{ 
    bool firstNameRequired = true; // TODO: Parse querystring 
    bool lastNameRequired = false; // TODO: Parse querystring 
 
    dynamic rtn = new ExpandoObject(); 
 
    if (firstNameRequired) 
        rtn.first_name = "Steve"; 
 
    if (lastNameRequired) 
        rtn.last_name = "Jobs"; 
 
    // ... and so on 
 
    return rtn; 
} 
 
void Main() 
{ 
    // Using the serializer of your choice: 
    Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(GetPerson())); 
} 

输出:

{"first_name":"Steve"}

我现在没有办法测试它 [我在 vanilla Web API 的生产中有类似的东西,有大量的可选字段],但是根据 .NET Core 文档,web 方法看起来有点像就像这样,尽管没有硬编码值!:

[HttpGet()] 
public IActionResult Get([FromQuery(Name = "fields")] string fields) 
{ 
    var fieldsOptions = fields.Split(','); 
 
    dynamic rtn = new ExpandoObject(); 
 
    if (fieldsOptions.Contains("FirstName")) 
        rtn.first_name = "Steve"; 
 
    if (fieldsOptions.Contains("LastName")) 
        rtn.last_name = "Jobs"; 
 
    if (fieldsOptions.Contains("Email")) 
        rtn.email = "steve@apple.com"; 
 
    return new ObjectResult(rtn); 
} 

您需要引用 System.Dynamic.Runtime包。