基于查询字符串的返回对象

时间:2017-11-11 19:19:25

标签: c# asp.net reflection .net-core

我试图根据查询字符串返回对象 例如,我希望api/users/{id}?fields=username,email,reputation返回User类型的对象,该对象仅包含三个包含的属性(用户名,电子邮件,信誉)。

另外,在.NET Core中,默认情况下不能使用逗号分隔的查询字符串 Here's a tutorial on making that work

按照上面的指南,我有一个字符串列表。如何创建仅包含与这些字符串名称匹配的属性的对象?
我只能做几个字符串(感谢Ben Hall):

List<string> listOfStrings ...; // Strings from query
User user = GetUser(id); // User from db 

User newUser = new User();

if (listOfStrings.Contains("username"))
    newUser.username = user.username;
if (listOfStrings.Contains("email"))
    newUser.email = user.email;
if (listOfStrings.Contains("reputation"))
    newUser.reputation = user.reputation;

但是对于很长的字符串列表(我的用户类有30多个属性),我该如何做呢?

作为参考,Facebook Graph API执行此操作。

3 个答案:

答案 0 :(得分:2)

List<string> listOfStrings ...; // Strings from query
User user = GetUser(id); // User from db 

User newUser = new User();
//gettting object type
var userType = user.GetType();

此解决方案需要一些关于思考的知识。它使用方法GetValue和SetValue
(代码在Visual Studio中测试)
现在是listOfStrings中的foreach元素

foreach(var propertyName in listOfString){
// This line of code retrives the value of the propety in the user class
 var retrivedValue = userType.GetProperty(propertyName).GetValue(user);
// This line of code sets the value retrived to the property in the newUser class
 userType.GetProperty(propertyName).SetValue(newUser, retrivedValue , null);
}

答案 1 :(得分:1)

我们可以探索其他方式,例如反思,但if应该还能为你提供足够的服务。看起来你试图在对象初始化器中使用If时犯了一个简单的错误。在安装新的User对象后,您必须这样做,例如

User newUser = new User();
if (listOfStrings.Contains("username"))
{
       newUser.username = user.username;
}

答案 2 :(得分:0)

Turns out there is actually Middleware for this called Popcorn.

  

Popcorn是一种基于RESTful API的通信协议,允许请求客户端在检索资源或资源集合时识别要包含的各个资源字段。

     

它允许递归选择字段,允许多次调用   被压缩成一个。

     

功能

     
      
  • 从RESTful API中选择性包含
  •   
  • 可配置的响应默认值
  •   
  • 回复排序
  •   
  • 响应值的选择性授权和许可
  •   
  • 可配置的响应检查员
  •   
  • 工厂和高级投影支持
  •   
  • 为您的API设置相关的上下文
  •   
  • 盲目扩展f响应对象
  •