为了解决从数据库读取的表字段和自己建的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赋值的更多相关文章

  1. Java反射给泛型集合赋值

    Java反射给泛型集合赋值 泛型 Java泛型简单描述下: 比如创建一个List集合,我想在里边只放Student对象信息,就需要写成 List<Student> studentList ...

  2. 利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理

    利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理   2018-3-10 15:18 | 发布:Admin | 分类:代码库 | 评论: ...

  3. 利用反射快速给Model实体赋值 使用 Task 简化异步编程 Guid ToString 格式知多少?(GUID 格式) Parallel Programming-实现并行操作的流水线(生产者、消费者) c# 无损高质量压缩图片代码 8种主要排序算法的C#实现 (一) 8种主要排序算法的C#实现 (二)

    试想这样一个业务需求:有一张合同表,由于合同涉及内容比较多所以此表比较庞大,大概有120多个字段.现在合同每一次变更时都需要对合同原始信息进行归档一次,版本号依次递增.那么我们就要新建一张合同历史表, ...

  4. 【转】利用反射快速给Model实体赋值

    原文地址:http://blog.csdn.net/gxiangzi/article/details/8629064 试想这样一个业务需求:有一张合同表,由于合同涉及内容比较多所以此表比较庞大,大概有 ...

  5. 利用反射,泛型,静态方法快速获取表单值到Model

    在项目中经常需要处理表单,给model赋值,很烦人的一些重复代码.如下边的代码: News news = new News(); news.Id = int.Parse(Request.Form[&q ...

  6. 利用反射快速给Model实体赋值

    试想这样一个业务需求:有一张合同表,由于合同涉及内容比较多所以此表比较庞大,大概有120多个字段.现在合同每一次变更时都需要对合同原始信息进行归档一次,版本号依次递增.那么我们就要新建一张合同历史表, ...

  7. .NET技术-1.0.使用反射、特性简化代码(验证Model类)

    使用反射.特性简化代码 参考项目:利用反射验证Model类/AssemblyVerification 假设现在有一个学生类(Student) /// <summary> /// 学生类 / ...

  8. DataTable转任意类型对象List数组-----工具通用类(利用反射和泛型)

    public class ConvertHelper<T> where T : new() { /// <summary> /// 利用反射和泛型 /// </summa ...

  9. 详解C#泛型(二) 获取C#中方法的执行时间及其代码注入 详解C#泛型(一) 详解C#委托和事件(二) 详解C#特性和反射(四) 记一次.net core调用SOAP接口遇到的问题 C# WebRequest.Create 锚点“#”字符问题 根据内容来产生一个二维码

    详解C#泛型(二)   一.自定义泛型方法(Generic Method),将类型参数用作参数列表或返回值的类型: void MyFunc<T>() //声明具有一个类型参数的泛型方法 { ...

随机推荐

  1. flask(二)之Jinja2模板与Flask-WTF

    01-文档 官方文档:http://docs.jinkan.org/docs/jinja2/ 02-基本语义 Jinja2做构成的模板文件中,文本内容大致可以分成几个种类.比如特殊文本(不进行转义,比 ...

  2. [Alpha阶段]第五次Scrum Meeting

    Scrum Meeting博客目录 [Alpha阶段]第五次Scrum Meeting 基本信息 名称 时间 地点 时长 第五次Scrum Meeting 19/04/09 教1_2楼教室 65min ...

  3. Jmeter Thread Group中如果存在HTTP request执行失败,就对整个Thread Group重新执行,限定最大执行次数N次

    由于在对WEB系统进行自动化测试的过程中,经常会由于握手连接断开等原因导致HTTP请求发送失败,如果重新执行一次,会是成功的.在每天的自动化冒烟测试过程中,生成在测试报告存在误报,严重浪费了测试人员确 ...

  4. Python——Mysql

    一.导入 import pymysql 二.连接 def connect_wxremit_db(): return pymysql.connect(host='10.123.5.28', port=3 ...

  5. MySQL-ERROR 2003

    1.首先安装mysqld服务器,输入命令:mysqld --install 2.输入命令:mysqld --initialize-insecure 3.输入命令:net start mysql

  6. 「【算法进阶0x30】数学知识A」作业简洁总结

    t1-Prime Distance 素数距离 大范围筛素数. t2-阶乘分解 欧拉筛素数后,按照蓝皮上的式子筛出素数. 复杂度:O(nlogn) t3-反素数ant 搜索 t4-余数之和 整除分块+容 ...

  7. 无需认证的mail,适用于ZABBIX等运维系统

    cat main.cf | grep "^\s[^# \t].$" queue_directory = /var/spool/postfix command_directory = ...

  8. U66785 行列式求值

    二更:把更多的行列式有关内容加了进来(%%%%%Jelly Goat奆佬) 题目描述 给你一个N(n≤10n\leq 10n≤10)阶行列式,请计算出它的值 输入输出格式 输入格式: 第一行有一个整数 ...

  9. vim命令编辑Host文件

    用vim命令打开Host文件 [root@localhost /]# vim /etc/hosts 按"i"键,进入编辑模式按"Esc"键,退出编辑模式 按&q ...

  10. django系列6:模板

    当前编辑的django页面,是默认的UI,如果想要改变页面展示,就需要用到模板. 模板的原理是这样的: 实际步骤: 1.编辑views.py,将template和content做好映射 from dj ...