1. 程式人生 > 其它 >c#利用反射與泛型實現crud增刪改查(持續更新)

c#利用反射與泛型實現crud增刪改查(持續更新)

解釋都在註釋裡了,會不斷更新

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}
Student
using System;
using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace ConsoleApp1 { public class DBHelper<T> where T : class, new() { //獲取資料庫連線名稱(在appsettings.json配置檔案下配置)
private static string con = "Data Source=.;Initial Catalog=hahha;user=sa;password=010806wpz.;"; /// <summary> /// 查詢 返回list泛型集合 /// </summary> /// <param name="where"></param> /// <returns></returns> public List<T> Query(string
where) { DataTable tb = new DataTable(); List<T> list = new List<T>(); string sql = GetQuerySql(); sql += where; //將連線字串賦值,獲取到一個新例項 using (SqlConnection connection = new SqlConnection(con)) { //開啟資料庫的連線 connection.Open(); //例項化sqlcommand using (SqlCommand command = new SqlCommand(sql, connection)) { SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(command); sqlDataAdapter.Fill(tb); //獲取T的型別 Type type = typeof(T); //迴圈行 for (int i = 0; i < tb.Rows.Count; i++) { //例項化T,每一次都需要例項化new 物件 Object obj = Activator.CreateInstance(type); for (int j = 0; j < tb.Columns.Count; j++) { //獲取列的名稱及型別 //tb.Columns[j].ColumnName代表每一列欄位的名稱(例如:ID,Name) //type.GetProperty:通過欄位名稱返回一個物件 //入參:要獲取的屬性名的字串 //返回值(出參):返回符合指定要求的屬性的物件(包括:欄位型別,欄位名稱等) PropertyInfo info = type.GetProperty(tb.Columns[j].ColumnName);//賦值 #region 型別的判斷並賦值 //int型別 if (tb.Columns[j].DataType == typeof(Int32)) { //有沒有可能空值? if (tb.Rows[i][j] != null) { //obj.setValue(info,12); info.SetValue(obj, int.Parse(tb.Rows[i][j].ToString()), null); } else { //null值的情況 info.SetValue(obj, 0, null); } } //float型別 else if (tb.Columns[j].DataType == typeof(float)) { //有沒有可能空值? if (tb.Rows[i][j] != null) { info.SetValue(obj, float.Parse(tb.Rows[i][j].ToString()), null); } else { //null值的情況 info.SetValue(obj, 0.0f, null); } } //datetime else if (tb.Columns[j].DataType == typeof(DateTime)) { //有沒有可能空值? if (tb.Rows[i][j] != null) { info.SetValue(obj, DateTime.Parse(tb.Rows[i][j].ToString()), null); } else { //null值的情況 info.SetValue(obj, DateTime.Now, null); } } //double else if (tb.Columns[j].DataType == typeof(double)) { //有沒有可能空值? if (tb.Rows[i][j] != null) { info.SetValue(obj, double.Parse(tb.Rows[i][j].ToString()), null); } else { //null值的情況 info.SetValue(obj, 0.00, null); } } //GUID else if (tb.Columns[j].DataType == typeof(Guid)) { //有沒有可能空值? if (tb.Rows[i][j] != null && !tb.Rows[i][j].ToString().Equals("")) { info.SetValue(obj, Guid.Parse(tb.Rows[i][j].ToString()), null); } else { //null值的情況 info.SetValue(obj, Guid.Parse("00000000-0000-0000-0000-000000000000"), null); } } else { //string //有沒有可能空值? if (tb.Rows[i][j] != null) { info.SetValue(obj, tb.Rows[i][j].ToString(), null); } else { //null值的情況 info.SetValue(obj, "", null); } } #endregion } //將object 型別強轉對應的型別 list.Add((T)obj);//(型別)強制轉換 } } } return list; } //獲取sql public string GetQuerySql() { Type type = typeof(T); //type.Name獲取類的名稱 //無需例項化 string sql = ""; sql = "select * from " + type.Name + " where 1=1 "; return sql; } } }
DBHelper
using System;
using System.Collections.Generic;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            DBHelper<Student> dBHelper = new DBHelper<Student>();
            List<Student> list= dBHelper.Query("");
            Console.WriteLine("資料量為:"+list.Count);
            Console.ReadKey();
        }
    }
}
Program

目前只寫了查詢,增刪改會再後續更新

希望我的文章能夠幫助到大家,一起加油!