根据实体类或字典检查传参,是否缺少参数并返回缺少参数

值类型必须声明可空

/// <summary>
/// 根据 Dictionary<string, string> 得到实体类的字段名称和值
/// </summary>
/// <typeparam name="T">实体类</typeparam>
/// <param name="t"></param>
/// <returns></returns>
public static Dictionary<string, string> GetProperties<T>(T t)
{
var ret = new Dictionary<string, string>();

if (t == null)
{
return null;
}
var properties = t.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);

if (properties.Length <= 0)
{
return null;
}
foreach (var item in properties)
{
var name = item.Name; //实体类字段名称
var value = Convert.ToString(item.GetValue(t, null)); //该字段的值

if (item.PropertyType.IsValueType || item.PropertyType.Name.StartsWith("String"))
{
ret.Add(name, value); //在此可转换value的类型
}
}

return ret;
}

/// <summary>
/// 获取实体类属性返回List列表
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <returns></returns>
public static List<string> GetPropertiesToList<T>(T t)
{
List<string> srtList = new List<string>();
if (t == null)
{
return null;
}
var properties = t.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
//properties[0].PropertyType.
foreach (var item in properties)
{

if (isType(item))
{
bool bo = item.GetType().IsGenericType;
/*
*这种也可以但必须对程序集有引用
* var cType = Type.GetType(classname + "," + dllName);//类名完整路径+程序集名称
*/
var className = "";
var dllName = System.IO.Path.GetFileNameWithoutExtension(item.Module.Name);//获取程序集名称
if (item.PropertyType.IsGenericType)
{
var rgx = new Regex(@"(?i)(?<=\[)(.*)(?=\])");//中括号[]
var typeName = item.GetMethod.ReturnType.FullName;
var tmp = rgx.Match(typeName).Value;//中括号[]
var tmpArray = rgx.Match(tmp).Value.Split(',');
className = tmpArray[0];//获取类名
}
else
{
className = item.PropertyType.FullName;//获取类名
}

var asmb = Assembly.Load(dllName);//加载程序集
var type = asmb.GetType(className ?? throw new InvalidOperationException("GetPropertiesToList方法中className获取类名为空")); // 通过类名获取类的type类型
if (type != null)
{
var propertyInfos = type.GetProperties(BindingFlags.Instance | BindingFlags.Public |
BindingFlags.IgnoreCase);
srtList.AddRange(propertyInfos.Select(info => info.Name));
}
}
srtList.Add(item.Name);
}
return srtList;
//return properties.Length <= 0 ? null : (from item in properties let name = item.Name where item.PropertyType.IsValueType || item.PropertyType.Name.StartsWith("String") select name).ToList();
}

/// <summary>
/// 根据Dictionary来设置实体类值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <returns></returns>
public static T SetProperties<T>(T t, Dictionary<string, string> d)
{
if (t == null || d == null)
{
return default(T);
}
var properties = t.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);

if (properties.Length <= 0)
{
return default(T);
}
foreach (var item in properties)
{
var name = item.Name; //名称
var value = Convert.ToString(item.GetValue(t, null)); //值
if (!item.PropertyType.IsValueType && !item.PropertyType.Name.StartsWith("String")) continue;
var val = d.FirstOrDefault(c => c.Key == name).Value;
if (val == null || val == value) continue;
if (item.PropertyType.Name.StartsWith("Nullable`1"))
{
item.SetValue(t, Convert.ToDateTime(val), null);
}
else
{
item.SetValue(t, val, null);
}
}

return t;
}

/// <summary>
/// 根据实体列表判断参数
/// </summary>
/// <param name="parameterList">参数列表</param>
/// <param name="entityList">实体列表</param>
/// <returns></returns>
public static List<string> IsPropertiesList(Dictionary<string, string> parameterList, List<string> entityList)
{
return entityList.Where(item => !parameterList.ContainsKey(item)).ToList();
}

/// <summary>
/// 根据实体列表判断参数
/// </summary>
/// <param name="parameterList">参数列表</param>
/// <param name="entityList">实体列表</param>
/// <returns></returns>
public static string IsDictionaryProperties(Dictionary<string, string> parameterList, List<string> entityList)
{
StringBuilder sb = new StringBuilder();
foreach (var item in entityList.Where(item => !parameterList.ContainsKey(item)))
{
sb.AppendLine(item + ",");
}
return (sb.Length > 0
&& !"null".Equals(sb.ToString())
&& !"".Equals(sb.ToString())) ? sb.ToString().Trim() : null;
//return entityList.Where(item => !parameterList.ContainsKey(item));
}
/// <summary>
/// 实体参数检查
/// </summary>
/// <typeparam name="T">接收参数的实体</typeparam>
/// <param name="t">接收参数的实体</param>
/// <param name="entityList">实体类</param>
/// <param name="isfq">为false时只对列表循环一次</param>
/// <returns></returns>
public static string IsModelProperties<T>(T t, List<string> entityList,bool isfq=false)
{
var fq = 0;
var sb = new StringBuilder();
//var ret = new Dictionary<object, object>();
if (t == null) { return null; }
var properties = t.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
if (properties.Length <= 0) { return null; }

foreach (PropertyInfo item in properties)
{
var name = item.Name;
var value = item.GetValue(t, null);
if (value!=null)
{
if (value.GetType().IsGenericType)
{
//var typeList = typeof(List<>);
//Type typeDataList = typeList.MakeGenericType(typeof(DateTime));//通过List<>构建出List<DateTime>
if (!(value is ICollection list)) continue;
if (list.Count <= 0) continue;

foreach (var enItem in list)
{

if (!isfq && fq>=1)
{
break;
}
fq++;
var modelEn = enItem.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);

foreach (var elist in from elist in entityList
from va in modelEn
where va.Name.Equals(elist, StringComparison.OrdinalIgnoreCase)
let data = va.GetValue(enItem, null)
where data == null
select elist)
{
if (!sb.ToString().ToUpper().Contains(elist.ToUpper()))
{
sb.AppendLine("属性名称: " + elist + ",");
}
}

//foreach (var elist in entityList)
//{
// foreach (var va in modelEn)
// {
// if (!va.Name.Equals(elist, StringComparison.OrdinalIgnoreCase)) continue;
// var data = va.GetValue(enItem, null);
// if (data == null)
// {
// sb.AppendLine(elist + ",");
// }
// }
//}
}
}
else
{
foreach (var elist in entityList)
{

var cou = properties.Where(n => n.Name == elist).ToList();
if (cou.Count > 0)
{
if (item.GetValue(t, null) != null) continue;
//存在等于空则添加
if (!sb.ToString().ToUpper().Contains(elist.ToUpper()))
{
sb.AppendLine("属性名称: " + elist + ",");
}

}
else
{
//不存在直接添加
if (!sb.ToString().ToUpper().Contains(elist.ToUpper()))
{
sb.AppendLine("属性名称: " + elist + ",");
}
}

}

}
}
else
{
//不存在直接添加
if (!sb.ToString().ToUpper().Contains(name.ToUpper()))
{
sb.AppendLine("属性名称: " + name + ",");
}
}

}

return (sb.Length > 0
&& !"null".Equals(sb.ToString())
&& !"".Equals(sb.ToString())) ? sb.ToString().Trim() : null;

}

/// <summary>
/// object转实体
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="listObj"></param>
/// <returns></returns>
private static List<T> PraseList<T>(object listObj)
{
List<T> result = new List<T>();
if (!listObj.GetType().IsGenericType)
throw new Exception("非集合类型");
if (listObj as System.Collections.ICollection != null)
{
var list = (System.Collections.ICollection)listObj;
if (list.Count > 0)
{
foreach (var item in list)
{
result.Add((T)item);
}
}
}
return result;
}

/// <summary>
/// Type传参转换成泛型T
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="inValue"></param>
/// <returns></returns>
public static T GetValue<T>(string inValue)
{
//一般类型
return (T)Convert.ChangeType(inValue, typeof(T));
}

/// <summary>
/// 判断是否常见值类型
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
public static bool isType(PropertyInfo item)
{
return !item.PropertyType.Name.StartsWith("string")
&& !item.PropertyType.Name.StartsWith("int")
&& !item.PropertyType.Name.StartsWith("double")
&& !item.PropertyType.Name.StartsWith("Int32")
&& !item.PropertyType.Name.StartsWith("Int64")
&& !item.PropertyType.Name.StartsWith("IntPtr")
&& !item.PropertyType.Name.StartsWith("DateTime")
&& !item.PropertyType.Name.StartsWith("bool");
}

C# WebApi 根据实体类检查传参或字典检查参数的更多相关文章

  1. mixin 在传参中可以出现 参数 在类内部可以定义 作用域

    mixin 在传参中可以出现 参数  在类内部可以定义

  2. C/C++函数调用时传参过程与可变参数实现原理

    C/C++函数调用时传参过程与可变参数实现原理 C语言的经典swap问题 在学习C语言的时候,我们大都遇到过一些经典例题,这些经典例题背后所代表的是往往是C/C++背后的一些运行原理,比如下面这个示例 ...

  3. Vue路由传参及传参后刷新导致参数消失处理

    项目功能需要,要从列表页跳转到第三方提供的URL上(这里第三方页面我是通过iframe引入在详情页,目的是点击返回时可以通过keepAlive让列表页不刷新,如果不通过iframe直接跳第三方链接,那 ...

  4. asp.net 通过ajax方式调用webmethod方法使用自定义类传参及获取返回参数

    实体类    public class User    {        public int Id { get; set; }        public string Name { get; se ...

  5. 第24课 std::thread线程类及传参问题

    一. std::thread类 (一)thread类摘要及分析 class thread { // class for observing and managing threads public: c ...

  6. jnhs-java实体类的有参构造器 无参构造器Could not instantiate bean class 实体类No default constructor found

    new一个对象的时候要用到构造函数, 例如Hello hello = new Hello();这时调用的是Hello的无参数构造方法; Hello hello = new Hello("hi ...

  7. axios的post传参时,将参数转为form表单格式

    import axios from 'axios'; import alert from './alert.js'; import Qs from 'qs' //引入qs 时axios的自带模块 le ...

  8. angular路由传参和获取路由参数的方法

    1.首先是需要导入的模块 import { Router } from "@angular/router";//路由传参用到 import{ActivatedRoute,Param ...

  9. vue 路由传参中刷新页面参数丢失 及传参的几种方式?

    在页面跳转中,我通过路由传参,结果发现页面参数丢失了.路径返回了根目录.... 1. 先说下路由传参的几种方式吧? 比如:<div v-for="item in items" ...

随机推荐

  1. 从 JVM 视角看看 Java 守护线程

    Java 多线程系列第 7 篇. 这篇我们来讲讲线程的另一个特性:守护线程 or 用户线程? 我们先来看看 Thread.setDaemon() 方法的注释,如下所示. Marks this thre ...

  2. 最长上升子序列 LIS nlogn

    给出一个 1 ∼ n (n ≤ 10^5) 的排列 P 求其最长上升子序列长度 Input 第一行一个正整数n,表示序列中整数个数: 第二行是空格隔开的n个整数组成的序列. Output 最长上升子序 ...

  3. Redis实现分布式文件夹锁

    缘起 最近做一个项目,类似某度云盘,另外附加定制功能,本人负责云盘相关功能实现,这个项目跟云盘不同的是,以项目为分配权限的单位,同一个项目及子目录所有有权限的用户可以同时操作所有文件,这样就很容易出现 ...

  4. django-Xadmin后台管理

    0919自我总结 django-Xadmin后台管理 一.安装环境 pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2 ...

  5. Kubernetes网络插件Flannel的三种工作模式

    跨主机通信的一个解决方案是Flannel,由CoreOS推出,支持3种实现:UDP.VXLAN.host-gw 一.UDP模式(性能差) 核心就是通过TUN设备flannel0实现(TUN设备是工作在 ...

  6. JavaScript专题之事件循环

    准备知识 1. 进程(process) 进程是系统资源分配一个独立单位,一个程序至少有一个进程.比方说:一个工厂代表一个 CPU, 一个车间就是一个进程,任一时刻,只能有一个进程在运行,其他进程处于非 ...

  7. 利用window10的Linux子系统实现docker的安装使用

    先参照 此博客 点这里 我在执行 apt installdocker.io 命令时,不能正确的安装 docker client 所以我找了下面的命令,然后执行 docker version 成功了 辅 ...

  8. 4.Linux文件管理相关命令(上)

    1.复制命令cp cp - copy files and directories 拷贝 文件 和 目录 -r 递归复制,通常用来复制目录 -p 保持复制源文件的属性 -v 显示复制的过程 1. 将当前 ...

  9. 算法问题实战策略 QUADTREE

    地址 https://algospot.com/judge/problem/read/QUADTREE 将压缩字符串还原后翻转再次压缩的朴素做法 在数据量庞大的情况下是不可取的 所以需要在压缩的情况下 ...

  10. linux系统状态网络、权限、用户大杂烩

    来来来,我们聊一下liunx系统相关的知识!! 首先从查询网络配置开始 ifconfig 查询.设置网卡和ip等参数 ifup,ifdown 脚本命令,更简单的方式启动关闭网络 ip命令是结合了ifc ...