Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反射与对象类在C语言中的应用#_C#_Asp.net Web Api - Fatal编程技术网

C# 反射与对象类在C语言中的应用#

C# 反射与对象类在C语言中的应用#,c#,asp.net-web-api,C#,Asp.net Web Api,我有一个API,在其中我接收自定义类的对象 [HttpPost("[action]")] public ResultSet AddApplication([FromBody] Application model) { // Code Here } 应用程序是一个自定义类,大约有64个属性 现在,我希望将其作为应用程序对象接收,而不是应用程序对象 public ResultSet AddApplication([FromBody] object

我有一个API,在其中我接收自定义类的对象

    [HttpPost("[action]")]
    public ResultSet AddApplication([FromBody] Application model)
    {
     // Code Here
    }
应用程序是一个自定义类,大约有64个属性

现在,我希望将其作为应用程序对象接收,而不是应用程序对象

    public ResultSet AddApplication([FromBody] object model)
在继续之前,我想检查是否有64键输入 “对象模型”与否

我可以通过课堂反思来做到这一点

     Type T = typeof(LoanApplication);
     PropertyInfo[] P = T.GetProperties();
但是如何检查对象类型中的键呢

我想要像这样的东西

[HttpPost("[action]")]
public ResultSet AddApplication([FromBody] object model)
{
 Type T = typeof(model);
 PropertyInfo[] P = T.GetProperties();
}
但是这里typeof(model)给出了错误,因为它是一个变量,不能像使用类型一样使用它

如果源发送错误的数据(属性或属性名称不匹配的更少),我需要这个,通过比较自定义类型的属性和接收到的对象,我应该能够找出什么是错误的

那么有没有办法从列表中的对象模型中获取关键点(有反射还是没有反射)

更新1:

[HttpPost("[action]")]
public ResultSet AddApplication([FromBody] Application model)
{
 // Code Here
}
若API接收到错误的模型,那个么上述代码中的模型将为null(在调试中),这意味着我们永远不会知道出了什么问题,哪个属性不匹配或者在接收到的对象中不存在

但是

在这里,若模型是错误的,那个么它将作为对象接收,通过获取其属性的数组或列表,我可以将其与我的自定义类型进行比较

这使我能够获得出错的每一个信息,我想发回这个响应,以便这个API的用户知道他们犯了什么错误

例如:


因此,正如我在评论中提到的,改变好的路径来解释坏的数据是一个非常糟糕的选择。你的好路径应该像一切正常一样完成它的工作。如果要捕获包含无效数据的请求,请使用ActionFilter:

public LogInvalidDataRequstFilterAttribute : ActionFilterAttribute
{
  public override void OnActionExecuting(ActinExecutingContext filterContext)
  {
    if (!filterContext.Controller.ViewData.ModelState.IsValid)
    {
      // Data isn't valid so now what?
    }
  }
}

[LogInvalidDataRequestFilter]
[HttpPost("[action]")]
public ResultSet AddApplication([FromBody] Application model)
{
 // Code Here
}

你为什么要这样做。因为如果源代码发送错误的数据(属性或属性名称不匹配),我应该能够通过比较自定义类型的属性和接收到的objectGood来找出错误,顺便问一下,您希望从客户端发送的任意数据创建什么运行时类型?我能想到的最好方法是使用dynamic,希望它能为您工作。我看到了您的更新1,在这种情况下,您可以定义自己的模型绑定类,在绑定之前可以选择验证其值。因为您没有标记任何asp.net版本,所以我假定它是asp.net核心。是自定义模型绑定的msdn参考。谢谢,但同样,这种方法只在数据注释验证的情况下有效,而不是我在这里提到的情况。如果用户发送的属性与actionfilter中的属性不匹配,则它将接收为null,并将使“ModelState.IsValid”无效。如果属性为null,并且它具有
[必需]
,则它无效…请检查更新1中的快照,在这种情况下,ModelState.IsValid没有提供任何信息,所以我已经回答完这个问题,因为您显然不明白这里发生了什么。祝你好运。非常感谢,非常有帮助
public LogInvalidDataRequstFilterAttribute : ActionFilterAttribute
{
  public override void OnActionExecuting(ActinExecutingContext filterContext)
  {
    if (!filterContext.Controller.ViewData.ModelState.IsValid)
    {
      // Data isn't valid so now what?
    }
  }
}

[LogInvalidDataRequestFilter]
[HttpPost("[action]")]
public ResultSet AddApplication([FromBody] Application model)
{
 // Code Here
}