利用特性和反射给泛型Model赋值
为了解决从数据库读取的表字段和自己建的viewModel字段名称不相符的问题
本人小白,初次将特性及反射应用到实例,写的不好的地方还请大家多多包涵
新建一个控制台应用程序命名为ReflectAndAttribute
自定义一个特性MTestyAttribute
namespace ReflectAndAttribute
{
[AttributeUsage(AttributeTargets.Property)]
public class MTestyAttribute:Attribute
{
public MTestyAttribute(string fieldName)
{
this.FiledName = fieldName;
} public string FiledName { get; set; }
}
}
定义个类StudentEntity模拟接收实体
public class StudentEntity
{
[MTesty("Name1")]
public string Name { get; set; }
public string Sex { get; set; }
}
定义一个泛型方法DtToModelList
public static List<T> GetModelList<T>(DataTable dt) where T : class, new()
{
// 定义集合
List<T> ts = new List<T>();
//定义一个临时变量
string tempName = string.Empty;
//遍历DataTable中所有的数据行
foreach (DataRow dr in dt.Rows)
{
T t = new T();
// 获得此模型的公共属性
PropertyInfo[] propertys = t.GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
MTestyAttribute attr = (MTestyAttribute)Attribute.GetCustomAttribute(pi, typeof(MTestyAttribute));
//将属性名称赋值给临时变量
tempName = pi.Name;
//特性不为null修改 tempName
if (attr != null) { tempName = attr.FiledName; }
if (dt.Columns.Contains(tempName))
{
//取值
object value = dr[tempName];
//如果非空,则赋给对象的属性
if (value != DBNull.Value)
{
pi.SetValue(t, value.ToString(), null);
}
}
} ts.Add(t);
}
return ts;
}
控制台代码
using System;
using System.Data; namespace ReflectAndAttribute
{
class Program
{
static void Main(string[] args)
{
//模拟数据表
DataTable dt = new DataTable("Table_Student");
dt.Columns.Add("Name1", System.Type.GetType("System.String"));
dt.Columns.Add("Sex", System.Type.GetType("System.String"));
DataRow dr = dt.NewRow();
dr["Name1"] = "AX";
dr["Sex"] = "M";
var dr1 = dt.NewRow();
dr1["Name1"] = "BX";
dr1["Sex"] = "F";
var dr2 = dt.NewRow();
dr2["Name1"] = "CX";
dr2["Sex"] = "F";
dt.Rows.Add(dr);
dt.Rows.Add(dr1);
dt.Rows.Add(dr2);
//接收实体
var studentList = DtToModelList.GetModelList<StudentEntity>(dt);
//输出结果
foreach(var student in studentList)
{
Console.WriteLine(string.Format("学生名字为:{0}", student.Name));
Console.WriteLine(string.Format("学生性别为:{0}", student.Sex));
}
Console.ReadKey();
}
}
}
利用特性和反射给泛型Model赋值的更多相关文章
- Java反射给泛型集合赋值
Java反射给泛型集合赋值 泛型 Java泛型简单描述下: 比如创建一个List集合,我想在里边只放Student对象信息,就需要写成 List<Student> studentList ...
- 利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理
利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理 2018-3-10 15:18 | 发布:Admin | 分类:代码库 | 评论: ...
- 利用反射快速给Model实体赋值 使用 Task 简化异步编程 Guid ToString 格式知多少?(GUID 格式) Parallel Programming-实现并行操作的流水线(生产者、消费者) c# 无损高质量压缩图片代码 8种主要排序算法的C#实现 (一) 8种主要排序算法的C#实现 (二)
试想这样一个业务需求:有一张合同表,由于合同涉及内容比较多所以此表比较庞大,大概有120多个字段.现在合同每一次变更时都需要对合同原始信息进行归档一次,版本号依次递增.那么我们就要新建一张合同历史表, ...
- 【转】利用反射快速给Model实体赋值
原文地址:http://blog.csdn.net/gxiangzi/article/details/8629064 试想这样一个业务需求:有一张合同表,由于合同涉及内容比较多所以此表比较庞大,大概有 ...
- 利用反射,泛型,静态方法快速获取表单值到Model
在项目中经常需要处理表单,给model赋值,很烦人的一些重复代码.如下边的代码: News news = new News(); news.Id = int.Parse(Request.Form[&q ...
- 利用反射快速给Model实体赋值
试想这样一个业务需求:有一张合同表,由于合同涉及内容比较多所以此表比较庞大,大概有120多个字段.现在合同每一次变更时都需要对合同原始信息进行归档一次,版本号依次递增.那么我们就要新建一张合同历史表, ...
- .NET技术-1.0.使用反射、特性简化代码(验证Model类)
使用反射.特性简化代码 参考项目:利用反射验证Model类/AssemblyVerification 假设现在有一个学生类(Student) /// <summary> /// 学生类 / ...
- DataTable转任意类型对象List数组-----工具通用类(利用反射和泛型)
public class ConvertHelper<T> where T : new() { /// <summary> /// 利用反射和泛型 /// </summa ...
- 详解C#泛型(二) 获取C#中方法的执行时间及其代码注入 详解C#泛型(一) 详解C#委托和事件(二) 详解C#特性和反射(四) 记一次.net core调用SOAP接口遇到的问题 C# WebRequest.Create 锚点“#”字符问题 根据内容来产生一个二维码
详解C#泛型(二) 一.自定义泛型方法(Generic Method),将类型参数用作参数列表或返回值的类型: void MyFunc<T>() //声明具有一个类型参数的泛型方法 { ...
随机推荐
- 二十九、layui分页插件的使用
<div id="page1"></div> <script> //开启分页 var page = 1; function findstoreL ...
- HTML之表格
表格标签和表格标题 表格标签 <table> <tr> <td></td> ...... </tr> <tr> <td&g ...
- 兼容IphoneX
兼容IphoneX的显示,一般有两种方法,一种通过css的media来做兼容,一种是通过js来做兼容. 一.我们先讲CSS的方法,我们要做两步即可: 1. 全屏覆盖,html使用 <meta n ...
- Java中NIO和IO区别和适用场景
NIO是为了弥补IO操作的不足而诞生的,NIO的一些新特性有:非阻塞I/O,选择器,缓冲以及管道.管道(Channel),缓冲(Buffer) ,选择器( Selector)是其主要特征. 概念解释: ...
- jQuery 事件冒泡
1 . 什么是冒泡 在页面上可以有多个事件,也可以多个元素响应同一个事件.假设网页上有两个元素,其中一个元素嵌套在另一个元素里,并且都被绑定了 click 事件,同时<body>元素上也绑 ...
- SaxReader读取xml
package com.java1234.action; import java.io.File; import java.util.List; import org.dom4j.Document; ...
- Android艺术——探究Handler运行机制
我们从开发的角度来说,Handler是Android 的消息机制的上层接口.说到Handler,大家都会说:哦,Handler这个我知道干什么的,更新UI.没错,Handler的确是用于更新UI的,具 ...
- emwin 之 GUI_MessageBox 阻塞特性
2019-03-01 [小记] GUI_MessageBox 函数执行后必须手动点击关闭窗口,未关闭窗口前线程将阻塞在此处等待关闭窗口事件 [使用场景] 由于该函数不会产生任何消息, 所以可利用阻塞特 ...
- CAN总线为什么要有两个120Ω的终端电阻?
1 CAN总线为什么要有两个120Ω的终端电阻? 2 终端电阻的作用是使阻抗连续,消除反射,那为什么只在物理上最远的两个节点加这个匹配电阻,而不是在所有的节点都加上匹配电阻? 高频信号传输时,信号波 ...
- 深入理解PHP的运行模式
PHP运行模式有4钟:1)cgi 通用网关接口(Common Gateway Interface))2) fast-cgi 常驻 (long-live) 型的 CGI3) cli 命令行运行 ( ...