目前接口统一使用 [FromBody]Dictionary<string,string> req 来接收。

有时候,需要把从req字典提取多个字段赋值给 model,几个还好,几十个赋值就不好了。因此设计了使用泛型、反射帮助赋值。

设计不怎么通用,随着类型的增多,这个需要继续迭代。

public static A MapperThree<A>(Dictionary<string, string> req)
{
A a = Activator.CreateInstance<A>();
try
{
Type Typea = typeof(A);
foreach (PropertyInfo propertyInfo in Typea.GetProperties())
{
if (req.ContainsKey(propertyInfo.Name))
{
// Type t = ap.GetType();
string proName = propertyInfo.PropertyType.Name;
if (proName == "String")
{
propertyInfo.SetValue(a, req[propertyInfo.Name]);
}
else if (proName == "Int32")
{
propertyInfo.SetValue(a, Convert.ToInt32(req[propertyInfo.Name]));
}
else if (proName == "DateTime")
{
propertyInfo.SetValue(a, Convert.ToDateTime(req[propertyInfo.Name]));
}
else if (propertyInfo.PropertyType.IsGenericType && propertyInfo.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
{ Type[] typeArray = propertyInfo.PropertyType.GetGenericArguments();
Type baseType = typeArray[];
if (baseType.Name== "Int32")
{
propertyInfo.SetValue(a, Convert.ToInt32(req[propertyInfo.Name]));
}
else if (baseType.Name == "DateTime")
{
propertyInfo.SetValue(a, Convert.ToDateTime(req[propertyInfo.Name]));
} }
else
{
//非int类型 and string ,datetime类型 不做处理
}
}
}
}
catch (Exception ex)
{
throw ex;
}
return a;
}

在写这个方法时,有两个注意点

一:获取属性类型,官网 https://docs.microsoft.com/en-us/dotnet/api/system.reflection.propertyinfo.propertytype?redirectedfrom=MSDN&view=netframework-4.7.2#System_Reflection_PropertyInfo_PropertyType

二:可空类型,拿出来的Name都是一样的Nullable`

也就是 Nullable<System.DateTime> 与 Nullable<System.Int> 的属性类型名字时一样的

       

解决办法:      从可空泛型参数里获取真实类型,下面代码,是根据实际需求设计,不具有通用性。

当然还有很多办法可以自动赋值,例如参数做对象绑定、参数为Json字符串通过序列化、反序列化解决。各有优缺点,根据情况权衡吧。

推荐阅读:https://www.cnblogs.com/landeanfen/p/5337072.html

WebApi接口传参的更多相关文章

  1. WebApi接口传参不再困惑(4):传参详解(转载)

    WebApi接口传参不再困惑(4):传参详解   前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方 ...

  2. C# WebApi 接口传参详解

    这篇文章主要介绍了C# WebApi 接口传参详解,本篇打算通过get.post.put.delete四种请求方式分别谈谈基础类型(包括int/string/datetime等).实体.数组等类型的参 ...

  3. WebApi 接口传参接参

    阅读目录 一.get请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4.“怪异”的get请求 二.post请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4.后台发送请求参数的 ...

  4. C#进阶系列——WebApi接口传参不再困惑:传参详解(转载)

    原文地址: http://www.cnblogs.com/landeanfen/p/5337072.html 前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用 ...

  5. WebApi接口传参不再困惑(4):传参详解 一、get请求 二、post请求 三、put请求 四、delete请求 五、总结

    前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方式方法,算是一个笔记,也希望能帮初学者少走弯路.本 ...

  6. WebApi接口传参不再困惑:传参详解

    原文出处: 懒得安分 前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方式方法,算是一个笔记,也希望 ...

  7. WebApi接口传参不再困惑(4):传参详解

    前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方式方法,算是一个笔记,也希望能帮初学者少走弯路.本 ...

  8. WebApi接口传参不再困惑:传参详解

    http://www.cnblogs.com/landeanfen/p/5337072.html

  9. [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参

    [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...

随机推荐

  1. 服务器安装ubuntu 14.04 server,开机启动屏幕不停滚动错误WRITE SAME failed. Manually zeroing

    昨天给服务器上安装了一个Ubuntu-14.04-server系统,安装完成后系统可以正常启动,但屏幕上一直滚动着一个错误,sda1:WRITE SAME failed. Manually zeroi ...

  2. mongoDB实现MapReduce

    一.MongoDB Map Reduce Map-Reduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE).MongoDB提供的Ma ...

  3. MySQL 三 通过yum源安装指定版本的mariadb

      1.yum源安装指定的版本     1)准备工作     下载安装当前次新版 https://downloads.mariadb.org/   选择rpm包,点击Repository Config ...

  4. MSF内网渗透 扫描模块

    端口扫描 auxiliary/scanner/portscan scanner/portscan/ack        ACK防火墙扫描 scanner/portscan/ftpbounce  FTP ...

  5. opencv源码编写规则

    OPENCV作为一种开源的计算机视觉库,我们有必要去了解这个库的一些编码格式及文件结构. 1.文档命名规则 必须将所有功能放入一个或多个.cpp和.hpp文件到OpenCV的相应模块中,或者如果贡献的 ...

  6. Latex 模版生成会议论文 不显示Keywords,而是显示 Index Terms- ,改成Keywords 方法

    一. 不管显示何种内容,TEX 文件都是 \begin{IEEEKeywords} 关键词1.关键词2,..... \end{IEEEKeywords} 其中:模版文件 IEEETran.cls存在下 ...

  7. ReactNative学习笔记(二)基础进阶

    一个最简单的HelloWorld页面 先不多解释,直接上代码: import React, { Component } from 'react'; import {AppRegistry, Style ...

  8. [转]kaldi上的深度神经网络

    转:http://blog.csdn.net/wbgxx333/article/details/41019453 深度神经网络已经是语音识别领域最热的话题了.从2010年开始,许多关于深度神经网络的文 ...

  9. 【Selenium专题】鼠标键盘事件

    引用包来自selenium-java-2.23.1.jar 调用以下代码时,需要引入actions类,以java为例: import org.openqa.selenium.interactions. ...

  10. GCD on Blackboard

    题目大意:给你n个数,然后在这n个数中选一个数,选中的这个数可以变成任意的数,使这n个数的gcd(最大公约数)最大.打印这个最大的gcd. 思路:这题一看貌似很复杂,其实这题只要你知道前缀和  和  ...