C#基础系列2:反射以及Attri…

C#之ORM ORM对象关系映射(Object-Relational Mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。ORM提供了概念性的、易于理解的模型化数据的方式。ORM方法论基于三个核心原则: 简单:以最基本的形式建模数据。 传达性:数据库结构被任何人都能理解的语言文档化。 精确性:基于数据... 阅读详情

反射以及Attribute在ORM中的应用

 

一、 反射
什么是反射?
简单点吧,反射就是在运行时动态获取对象信息的方法,比如运行时知道对象有哪些属性,方法,委托等等等等。
反射有什么用呢?
反射不但让你在运行是获取对象的信息,还提供运行时动态调用对象方法以及动态设置、获取属性等的能力。
反射在ORM中有什么用呢?
我这里所讨论的ORM实现是通过自定义Attribute的方式进行映射规则的描述的。但是我们并不知道具体哪个对象需要对应哪个表,并且这些对象是独立于我们的ORM框架的,所以我们只能通过自定义Attribute来定义映射规则,然后通过反射来动态获取这些映射规则。
反射的实现:
下面我们就以简单的获取对象的属性值的方式来做讨论,假设我们有类Person,其中有3个属性Name、Age,Sex。我们通过反射的方法来动态获取Person的对象的这三个属性的值。

public class Person
{
    private string _Name;
    private int _Age;
    private string _Sex;

    public string Name
    {
        get { return this._Name; }
        set { this._Name = value; }
    }

    public int Age
    {
        get { return this._Age; }
        set { this._Age = value; }
    }

    public string Sex
    {
        get { return this._Sex; }
        set { this._Sex = value; }
    }
}
测试代码如下:

 

static class Program
{
    [STAThread]
    static void Main()
    {
        Person person = new Person();
        person.Name = "snoopy";
        person.Age = 5;
        person.Sex = "male";

        PropertyInfo[] infos = person.GetType().GetProperties();
        Console.WriteLine("打印属性");
        foreach (PropertyInfo info in infos)
        {
            //获取属性并打印
            Console.WriteLine(info.Name + ":" + info.GetValue(person, null));
        }

        Console.WriteLine("设置Person.Name = Hellokitty");
        //设置属性,设置Name属性
        foreach (PropertyInfo info in infos)
        {
            if (info.Name == "Name")
            {
                info.SetValue(person, "Hellokitty", null);
            }
        }

        Console.WriteLine("打印属性");
        foreach (PropertyInfo info in infos)
        {
            //获取属性并打印
            Console.WriteLine(info.Name + ":" + info.GetValue(person, null));
        }
        Console.Read();
    }
}
 

上面演示了通过反射的方法来动态获取和设置对象属性的方法。但是这和ORM以及Attribute有什么关系呢?这个是我们接下来的这个部分的内容。

 


二、Attribute的使用:
Attribute中文翻译虽然也号称“属性”,但是她和对象的属性(Property)其实是完全不同的两概念。她是在运行时对对象或者对象属性、方法、委托等等进行描述的类,用于在运行时描述你的代码或者在运行时影响你的程序的行为。
其实我们在c#的编程中经常看到Attribute,只不过我们没有注意罢了。比如Main函数前的“[STAThread]”这个其实就是一个Attribute。全程为[STAThreadAttribute]。另外指定类可序列化的[Serializable]等等。是不是都很熟悉啊?只不过平时估计没有用到,所以没有注意罢了。

既然Attribute是类,那么她的定义方法和类就没有两样了,唯一的不同就是自定义Attribute类必须继承于System.Attribute。
下面我们来简单定义一个描述数据库字段信息的Attribute,在此类中我们采用更省略的方式,仅仅提供“字段名”,“字段类型”:

public class DataFieldAttribute : Attribute
{
    private string _FieldName;
    private string _FieldType;

    public DataFieldAttribute(string fieldname, string fieldtype)
    {
        this._FieldName = fieldname;
        this._FieldType = fieldtype;
    }

    public string FieldName
    {
        get { return this._FieldName; }
        set { this._FieldName = value; }
    }

    public string FieldType
    {
        get { return this._FieldType; }
        set { this._FieldType = value; }
    }
}
好,我们有了自己的描述数据库字段的Attribute,那么我们现在将其应用到实际的类中。我们还是继续上面的Person类,使用方法如下:

 

 

 


public class Person
{
    private string _Name;
    private int _Age;
    private string _Sex;

    [DataFieldAttribute("name", "nvarchar")]
    public string Name
    {
        get { return this._Name; }
        set { this._Name = value; }
    }

    [DataFieldAttribute("age", "int")]
    public int Age
    {
        get { return this._Age; }
        set { this._Age = value; }
    }

    [DataFieldAttribute("sex", "nvarchar")]
    public string Sex
    {
        get { return this._Sex; }
        set { this._Sex = value; }
    }
}
通过自定义Attribute,我们定义了类属性和数据库字段的一一对应关系,我们对Person类的Name、Age、Sex属性都加上了Attribute的描述,指定了他们对应的字段名以及类型,其中Person.Name对应于字段name,字段类型Nvarchar...。

 

三、反射和Attribute的联合使用。
从上面的描述中,我们了解了反射,了解了Attribute,了解了ORM映射规则的定义。但是刚接触的朋友估计还是迷惑,我们怎么动态获取这些映射规则呢?听洒家慢慢道来。
这就需要使用反射了:
下面的例子,我们由于对Person中的Name,Age以及SEX都增加了DataFieldAttribute的描述,这其实就是增加了O(对象)/R(关系数据库)的映射规则,下面我们就通过反射的方法来动态获取此映射规则:


static class Program
{
    [STAThread]
    static void Main()
    {
        Person person = new Person();
        person.Name = "snoopy";
        person.Age = 5;
        person.Sex = "male";

        PropertyInfo[] infos = person.GetType().GetProperties();

        object[] objDataFieldAttribute = null;
        foreach (PropertyInfo info in infos)
        {
            objDataFieldAttribute = info.GetCustomAttributes(typeof(DataFieldAttribute), false);
            if (objDataFieldAttribute != null)
            {
                Console.WriteLine(info.Name + "->数据库字段:" + ((DataFieldAttribute)objDataFieldAttribute[0]).FieldName);
            }
        }
    }
}


 

哈哈,你是不是很想动手了啊?当然了如果你到了这一步就开始动手的话,那我就很高兴了,说明我的描述还算清楚(注:对于已经知道的大牛们此话无效)。也说明你很有动手的能力。因为接下来的工作就是怎样根据这种方法动态地从对象中获取映射规则,动态构造Insert,Update,Delete等语句。

 

四、本章总结
本章中我比较详细地介绍了反射,自定义Attribute的概念和应用,并且介绍了怎样在运行时动态获取O/R Mapping的映射规则等。当然我这里的代码仅仅是举例,而要真正实现一个ORM,我们还需要考虑的很多,比如:
1、Person对应于哪张数据库表?
2、Person中的PK和FK(如果有的话)怎么表示?
......
这些问题将在我的下一篇中进行讲解。

 

C#学习笔记 使用ORM框架SqlSugar 由果糖团队维护的一款开源DotNet ORM框架SqlSugar .Net ORM 5.X 官网 、文档、教程 - SqlSugar 5x - .NET果糖网 (donet5.com) 阅读详情

相关推荐

C#进阶:轻量级ORM框架Dapper详解

Dapper是一个轻量级、高性能的.NET ORM工具,它允许开发者直接编写SQL语句并映射到.NET对象。通过提供简单的API和高效的性能,Dapper成为许多.NET开发者的首选ORM之一。然而,它也有一些局限性,如缺乏内置的高级功能和SQL依赖等。在使用Dapper时,建议结合项目需求、数据库环境和开发团队的经验来评估其适用性,并考虑使用插件和扩展来增强其功能。同时,也需要注意SQL注入的风险,并确保编写高效的SQL查询和合理的数据库操作。

陈辰学长的博客 5902

C#中的ORM框架

1. 什么是ORM ORM:对象关系映射(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 用于实现面向对象编程语言里不同类型系统的数据之间的转换 ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象与关系数据库相互映射 ORM可以解决数据库与程序间的异构性,比如:在C#中我们使用string表示字符串,而Oracle中可使用varchar2,MySQL中可使用varchar,SQLServer可使用nvarchar。 如果没有ORM我们原始

XiaoCai 9514

深入解析ORM技术及C#常用框架指南

​(Object-Relational Mapping,对象关系映射)是一种通过面向对象的方式操作关系型数据库的技术。它像一座桥梁,将面向对象编程语言(如C#)中的类与关系型数据库(如SQL Server、MySQL)的表结构进行映射,开发者无需直接编写SQL语句即可完成数据存取。

品质生活,极致编程。 1472

C#ORM(关系对象映射)的框架

一、关于ORM ORM的概念: 对象关系映射(Object Relationsl Mapping,简称ORM,或O/RM,或O/R mapping),是一种技术,用于实现面向对象编程语言里不同类型系统数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。 ORM的优势:实现快速开发,方便移植数据库。 .NET开发中的ORM框架: NHibernate 、MyBatis.NET 、LINQ to SQL(已经不再使用) 、 ADO.NET Entity Frame..

weixin_44548405的博客 5994

C#中实现ORM的简易教程

简介:ORM是一种将关系数据库映射到面向对象语言的技术,C#中的ORM框架能提升数据库操作的开发效率,减少SQL编写。本款轻量级ORM工具专为SQL数据库设计,重点在于易用性和性能,易于集成到.NET Framework 4.5和Visual Studio 2017开发环境中。它包括一个简单的用户界面和示例应用,以及一个配套的SQL脚本文件,用于演示数据操作和数据库结构初始化。本教程将介绍关键概念如实体类、映射配置、数据上下文、查询、插入、更新和删除,以帮助C#开发者快速掌握ORM的使用。

weixin_32047493的博客 1458

深入理解C#轻量级ORM框架FluentData

ORM(对象关系映射)框架作为C#开发中的重要组成部分,主要用于简化数据库操作,它通过映射数据库表与C#对象的方式,让开发者能够在不直接编写SQL语句的情况下完成对数据库的操作。本章我们将详细介绍一个轻量级ORM框架——FluentData,它以其简洁和高效著称,易于学习和使用,非常适合小型到中型项目的数据库操作。FluentData是一个为.NET应用程序设计的轻量级、高性能的ORM解决方案。它采用Fluent API的方式,使得数据库操作更加直观和简洁。

weixin_35094083的博客 934

C# Attritube

特性学习 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp1 { class Oyster : System.Attribute { pr...

qq_32354205的博客 290

一个C#的ORM框架

一个自己写的ORM框架,做了一些连接池和OR映射的功能, 测试效率还行,详情见http://blog.youkuaiyun.com/shmilyhe/archive/2009/09/07/4526191.aspx 暂时只支持SQL SERVER 和MYSQL 晚些会上传一些DEMO

Using Attributes in C#

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 590

使用C#的Attribute(特性)实现一个简单的ORM

【内容概要】:在C#中通过学习使用Attribute,实现一个简单的ORM框架。里面主要有两部分的内容,学习使用Attribute获得设定值;学习通过反射获取属性的值 【适应人群】:初级工程师。但需要对反射、Attribute有一定的了解 【使用场景及目标】:通过样例,能够更好的理解与掌握Attribute的知识,同时也对一般的ORM框架有个基本的任职 【其他说明】:暂无

大象机器人myAGV移动机器人+mechArm六轴机械臂,开源复合机器人开发与实践!

我们这章节的内容是将协作性机械臂打破距离上的限制,跟移动机器人(myAGV)相连接,实现一个案例。

m0_71627844的博客 1488

【ORM】浅聊C#和Java的ORM底层框架

国庆假期马上结束,闲暇时间,突然对Ado.Net这个词的由来感兴趣,然后就一顿复习了一遍,顺便也了解了下java关于ORM框架的底层是什么!

小5聊的博客 2813

深入探索 ClickHouse:性能优化之道

在大数据处理的广袤天地里,ClickHouse 宛如一颗璀璨的明星,以其卓越的性能为海量数据的存储与查询提供了强大助力。但要想让 ClickHouse 发挥出极致效能,性能优化至关重要。今天,就让我们一同深入探寻 ClickHouse 的性能优化之路。

arnold66的专栏 1547

C#手把手教你写一个自己的ORM(一)

网上的ORM框架很多,比如Freesql、sqlsugar、EF等等,在一个新项目中,我们可以直接引入使用;但是有个问题,如果你接手的事一个老项目,实体不能动,代码不能给人家搞乱,那你该怎么办呢?这个时候,我们就需要自己了解一下ORM的原理,然后自己写一个简易的,符合自己公司框架逻辑的ORM进行使用了。下面我会从浅到深,讲解一下ORM的基本实现方法。

qq_43535970的博客 2562

ThingsBoard入门实战(七):公共发布和 UI 细节修改

公共发布和 UI 细节修改7.细节修改和公共发布一、公共发布二、UI优化下载运行修改三、下一步还可以做什么?更好的UI更丰富的系统模块 7.细节修改和公共发布 GET到新技能了,想给兄弟们演示,需要给他们每个人一个账号么? 答案肯定是:不需要! ThingsBoard 用 公共发布 解决了这个问题。 一、公共发布 首先我们来看一下路灯设备现在在谁名下? 如下图,路灯都是customerA的, 目前只有它和它的租户可以看到,其他人需要看就需要设为公有。 如图操作: 对于设备详情仪表盘,我们也需要设为公有

AIGC搞起 9119

Zemax实战录——非序列模式下的微透镜阵列仿真与优化

本文详细介绍了在Zemax非序列模式下进行微透镜阵列仿真的完整流程与优化技巧。文章重点阐述了从序列模式切换到非序列模式的必要性,并逐步指导如何搭建光源、阵列与探测器的仿真环境。核心在于通过调整圆锥系数等关键参数优化像差,并增加光线数以提升仿真精度与均匀性,为光学设计提供可靠依据。

weixin_28339967的博客 524

C# ORM框架-Entity Framework Core

Entity Framework Core(简称EF Core)是一个现代的、跨平台的、开源的对象关系映射(ORM)框架,由微软开发。它允许.NET开发者通过.NET对象与关系型数据库进行交互,而无需编写大部分的数据访问代码,极大地简化了数据访问的过程。

語衣的个人博客 3138

基于YOLOv8与UI界面的校园垃圾分类督导系统

YOLO(You Only Look Once)是目前最为广泛使用的目标检测算法之一。它通过一次前向传递即完成目标检测,具有极高的速度与效率。YOLOv8是YOLO系列的最新版本,相比于之前的YOLO版本,YOLOv8在速度、精度、检测能力等方面都有了显著的提升。本项目通过结合YOLOv8模型与UI界面,成功实现了校园垃圾分类督导系统。该系统能够自动识别不同类型的垃圾,并通过UI界面实时展示垃圾分类的结果。

YOLO 337

C#手把手教你写一个自己的ORM(完)

  对象关系映射(Object Relational Mapping),目前数据库是关系型数据库 , ORM 主要是把数据库中的关系数据映射成为程序中的对象。ORM提供了实现持久化层的另一种模式,它采用映射元数据来描述对象关系的映射,使得ORM中间件能在任何一个应用的业务逻辑层和数据库层之间充当桥梁。Java典型的ORM中间件有:Hibernate,Mybatis等。 这样能够让程序员更多的关注业务编程,而不用浪费在SQL语句的编写上。

qq_43535970的博客 1406

【即插即用模块】Transformer篇 | CVPR 2025 | D2T:双域特征融合,完美适配缺陷检测/小目标检测和分割等频域细节敏感的任务!

本文提出了一种基于小波和原型增强的双域Transformer(WPFormer)用于像素级表面缺陷检测。该模型通过Dual-domain Transformer (D2T)模块融合频域和空间域特征:小波增强交叉注意力(WCA)分解高低频特征并加权平衡,增强缺陷细节捕捉;原型引导注意力(PCA)生成全局原型向量强化关键信息聚合。实验表明,该模块在缺陷检测任务中性能优于现有方法,通过频域细节增强和全局依赖建模有效提升了复杂场景下的检测效果。代码已开源,适用于对频域敏感的目标检测和分割任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1374

如何在白平衡标定种构建不同类型的白平衡色温坐标系

以各家芯片方案的白平衡色温坐标系为切入点,详细介绍了各家芯片色温坐标系构建的理论依旧;并解析了不同色温坐标系下的物理含义,提提出了多种不同的色温坐标系

大熊 959

C#中的ORM和EF框架

在 C# 中,ORM 代表对象关系映射(Object-Relational Mapping)。这是一种编程技术,用于在关系数据库和对象程序语言之间转换数据。ORM 允许开发者使用面向对象的方式来处理数据库操作,而不是编写复杂的 SQL 语句。抽象化数据库访问:开发者可以像操作对象一样操作数据库,而不需要直接编写 SQL 代码。数据映射:ORM 框架将数据库中的表映射为类,行映射为对象实例,列映射为对象的属性。查询语言。

愿你历尽千帆,归来仍是少年。 3528

【云原生技术】云计算与网络:容器服务(Tencent Kubernetes Engine,简称TKE)简介

基本概念主要特点应用场景技术实现容器服务(Tencent Kubernetes Engine,简称TKE)是腾讯云提供的一种托管的容器管理服务,基于开源的Kubernetes系统。TKE旨在简化容器的部署、管理和扩展,并且提供高性能、可靠性和安全性,适用于各种规模的企业和应用。

weixin_46453070的博客 2043

C#学习-ORM框架

ORM解决的主要问题是对象和关系的映射。它通常把一个类和一个表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。ORM提供了对数据库的映射,不用直接编写SQL代码,只需像操作对象一样从数据库操作数据。了解了一下解决方案和项目的关系,之前我创建新项目的时候勾选了把解决方案放入同一个文件夹,然后每次在解决方案里增加新项目都很奇怪,参考了一下文章。找了一个教程,发现教程给的代码报错,教程说下载的程序包也找不到,不了解为什么,决定换个教程或者找其他框架。准备换SqlSugar。

kininee的博客 752

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C#常用的几个ORM框架及简单对比

ORM => 对象关系映射(英语:Object Relational Mapping)对于O/R,即 Object(对象)和 Relational(关系型数据),表示必须同时使用面向对象和关系型数据进行开发。 ORM框架 用途 => 为了解决 软件项目 与 数据库 打交道的中间层。 1.EntityFramework 可以直接写LINQ & Limbda语法,使用最为广泛...

AndroidOrCsharp 5717

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C#进阶-了解ORM框架SqlSugar并巧妙使用(附相关数据库工具)

通过NuGet包管理器搜索SqlSugar、MySql.Data、Newtonsoft.Json三个包并安装。

rwo_bear的博客 6389

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: C#基础系列3:实现自己的ORM…
下一篇: C#基础系列1:实现自己的ORM…
绝凌峰
博客等级 码龄18年 28粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值