C#利用反射实现orm

本文介绍了如何在C#中利用反射和特性实现ORM。通过定义DataFieldAttribute和TableAttribute特性来标注实体类,结合反射进行数据库操作,使用SqlConnection、SqlCommand等类与数据库交互。详细内容包括特性定义、反射操作属性以及数据库操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前用java做过一次,这次因为到公司用的是C#所以再做一次

主要用到的知识有:①特性(类似Java的注解)②反射③泛型④C#的数据库操作

特性

先定义一个特性,需要继承Attribute

using System;
using System.Data;

namespace SimpleORM.Attributes
{
    public class DataFieldAttribute: Attribute
    {
        public string _FieldName { get; private set; }
        public SqlDbType _FieldType { get; private set; }
        public int _Length { get; private set; }
        public DataFieldAttribute(string fieldname, SqlDbType fieldtype,int len)
        {
            _FieldName = fieldname;
            _FieldType = fieldtype;
            _Length = len;
        }
    }
}

然后就是使用它

using System.Data;

namespace SimpleORM.Attributes
{
    public class Bean
    {
        [DataField("ID",SqlDbType.Int,1)]
        public short id { get; private set; }

        [DataField("Name", SqlDbType.NVarChar,50)]
        public string name { get; private set; }

        [DataField("InDate", SqlDbType.DateTime,20)]
        public string InDate { get; private set; }

        [DataField("InUser", SqlDbType.NVarChar,15)]
        public string InUser { get; private set; }

        [DataField("LastEditDate", SqlDbType.DateTime, 20)]
        public string LastEditDate { get; private set; }


        [DataField("LastEditUser", SqlDbType.NVarChar,15)]
        public string LastEditUser { get; private set; }

        public Bean() { }

        public Bean(short id, string name, string InDate, string InUser, string LastEditDate, string LastEditUser)
        {
            this.id = id;
            this.name = name;
            this.InDate = InDate;
            this.InUser = InUser;
            this.LastEditDate = LastEditDate;
            this.LastEditUser = LastEditUser;
        }
    }
}

DateFieldDataFieldAttribute的缩写,所以使用[DataFieldAttribute("ID",SqlDbType.Int,1)]也是可以的

反射

C#里的Type相当于java的Class,有两种方式可以获得Type对象:

①Type t=entity.getType();

②Type t=typeof(Entity);

利用反射操作属性

Bean entity=new Bean(.....);
PropertyInfo[] infos = entity.GetType().GetProperties();
foreach (PropertyInfo info in infos)
{
    //访问字段
    Console.WriteLine("字段名:{0},字段值{1}",info.Name,info.GetValue(entity));

    //访问特性
    Object[] dataFieldAttribute = info.GetCustomAttributes(typeof(DataFieldAttribute), false);
    DataFieldAttribute attr = dataFieldAttribute[0] as DataFieldAttribute;//强制转换
    Console.WriteLine("该字段的DataFieldAttribute特性:_FieldName--{0},_FieldType--{1},_Length--{2}",attr._FieldName,attr._FieldType, attr._Length);

    //设置字段值,需要注意的是利用反射设置值要保证类型相同
    info.SetValue(entity, Convert.ChangeType(这儿些你要转换的类型, info.PropertyType));
}

C#的数据库操作

用到的类有:

①SqlConnection       连接对象

②SqlCommand         组装sql语句,并且执行

③SqlParameter        预编译用

④SqlDataReader      返回的结果

string str="Server=...;UID=...;Password=...;Database=...";
SqlConnection conn=SqlConnection(str);
conn.Open();
SqlCommand cmd 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值