为了解决从数据库读取的表字段和自己建的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. SQL的一些基础查询语法

     基础.限定.模糊查询     关键字都是大写. 使用 BETWEENN AND 的时候小的数字或者日期放到  AND(并且)  的面前,大的一个放到AND 后面.   数据操纵语言SQL分类(DML ...

  2. Git各个状态之间转换指令总结

    基本状态标识 A- = untracked 未跟踪 A = tracked 已跟踪未修改 A+ = modified - 已修改未暂存 B = staged - 已暂存未提交 C = committe ...

  3. Shell脚本中的break continue exit return

    转自:http://www.cnblogs.com/guosj/p/4571239.html break结束并退出循环 continue在循环中不执行continue下面的代码,转而进入下一轮循环 e ...

  4. JAVA ==号和equals()的区别

    ==号和equals()方法都是比较是否相等的方法,那它们有什么区别和联系呢? 首先,==号在比较基本数据类型时比较的是值,而用==号比较两个对象时比较的是两个对象的地址值: int x = 10; ...

  5. 关于CentOS7.2 控制面板不显示输入法,或者无法调出输入的问题。(已解决)

    问题描述: CentOS7.2 桌面系统控制面板突然就不显示输入法的图标,快捷键也调不出输入法. 解决方法: test@base0200: ~ $ ibus-setup 调出ibus首选项--> ...

  6. springboot 集成swagger

    了解到swagger 就记录下用法 pom.xml <dependency> <groupId>io.springfox</groupId> <artifac ...

  7. [模板] CDQ分治&&BZOJ3262:陌上花开

    简介 CDQ分治是分治的一种, 可以看做归并排序的扩展, 利用离线将一些 \(O(n)\) 的暴力优化到 \(O(log n)\). 它可以用来顶替一些高级(log)数据结构等. 一般地, CDQ分治 ...

  8. 利用 UDF 轻松迁移

    位运算.布尔运算和逐位运算的乐趣 如果您正从支持位运算.布尔运算以及一些函数的数据库迁移到 IBM® DB2® Universal Database™(UDB),那么您也许会对如何在 DB2 中处理这 ...

  9. intellij 操作

    默认快捷键 ctrl+alt+l 格式化代码 alt+insert代码自动生成 代码生成 编辑框右键>generator>选择

  10. JSTL和EL的使用

    JSTL和EL的使用 使用JSTL前的准备 想要使用JSTL,首先需要给工程导入JSTL的包(JSTL.jar和standard.jar). JSTL标签库 在JSTL中分为以下五个标签 核心标签 格 ...