C#反射获取数据库字段

static string sqlselect = "insert into {0}({1}) values ({2})";
(这个方法可以适用于任何数据库的插入语句)
        public static int managerRegister<T>(T field) {
            string fieldName = "";
            string fieldList = "";
            string fieldValue = "";
            int k = 0;
            Type tf = typeof(T);
            fieldName = tf.Name;//获取类型名称
            PropertyInfo[] pinfo = tf.GetProperties();//获取属性
            string[] paraList = new string[pinfo.Length];//参数化查询字段的数组
            List<SqlParameter> para = new List<SqlParameter>();//用于放置参数化查询
            foreach (PropertyInfo p in pinfo)
            {
                fieldList += p.Name + ",";
                fieldValue += "'" + p.GetValue(field).ToString() + "'" + ",";
                paraList[k] = p.Name;
                para.Add(new SqlParameter("@" + paraList[k], fieldValue));
                k = k + 1;//当循环执行时k加一使得数组能够连续获取到字段
            }
            fieldList = fieldList.Substring(0, fieldList.Length - 1);//去除最后一个逗号
            fieldValue = fieldValue.Substring(0, fieldValue.Length - 1);
            sqlselect = string.Format(sqlselect, fieldName, fieldList, fieldValue);
            int value = DBhelper.ExcuteQuery(sqlselect, para.ToArray());//调用自己写的一个数据库插入语句并返回一个值
            return value;//返回插入语句的情况
        }
以下是我的数据库字段
 
 

下面是我的插入语句

public static int ExcuteQuery(string sql, SqlParameter[] para) {
            int value;
            SqlCommand cmd = SqlCmd(sql);
            cmd.Parameters.AddRange(para);
            try
            {
                 value = cmd.ExecuteNonQuery();
                 return value;
            }
            catch
            {
                return -1;
            }           
        }

下面是调用界面

protected void Btn_Save_Click(object sender, EventArgs e)
        {
            Bc_Login a = new Bc_Login() { username = txt_Username.Text, pwd = txt_Repassword.Text };
            if (txt_Password.Text != "" && txt_Username.Text != "" && txt_Repassword.Text != "")
            {
                int value = ManagerRegister.managerRegister<Bc_Login>(a);
                if (value > 0)
                {
                    Response.Write("<script>alert(\"注册成功!\")</script>");
                    Response.Redirect("index.aspx");
                }
                else
                {
                    Response.Write("<script>alert(\"注册失败!请检查用户名或密码后重试!\")</script>");
                }
            }
            else {
                Response.Write("<script>alert(\"请检查用户名或密码!\")</script>");
            }
        }

插入页面的效果

反射获得字段,其实是浪费资源性能的做法,但是有些时候为了少写代码,还是会用到反射,这只是个最基础的例子,

别看界面做的好看,但是内部还是挺乱的,最后补充反射的原理

在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为反射机制。通俗点讲,通过反射,类对我们来说是完全透明的,想要获取任何东西都可以。

对于反射说明我随机挑选了一个不错的例子供大家参考:https://www.cnblogs.com/sxw117886/p/5687590.html

原作者:幻影星辰

反射我前面有一个图片,一个C#程序运行时是先经过编译器编译后经过IL编译之后到JIT/CLR最后再到二进制能被机器所认识的代码

其实反射是从内存中反向获得assembly

其余的以后再补充。

 

转载于:https://www.cnblogs.com/sandaman2019/p/10792556.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用反射获取实体类中所有字段的属性,然后通过自定义属性或者约定俗成的规则,获取每个字段对应的数据库字段名。 以下是一个示例代码: ```csharp using System; using System.Collections.Generic; using System.Linq; using System.Reflection; public static class DatabaseUtility { public static Dictionary<string, string> GetDatabaseFields(string entityClassName, string prefix = "") { var entityAssembly = Assembly.GetExecutingAssembly(); // 获取实体类所在的程序集 var entityClass = entityAssembly.GetTypes().FirstOrDefault(t => t.Name == entityClassName); // 获取实体类的 Type if (entityClass == null) { throw new ArgumentException($"Entity class {entityClassName} not found in assembly."); } var databaseFields = new Dictionary<string, string>(); foreach (var field in entityClass.GetFields(BindingFlags.Public | BindingFlags.Instance)) { var fieldName = prefix + field.Name; // 默认情况下,数据库字段名与实体类字段名相同,可以通过参数 prefix 添加前缀 var databaseFieldAttribute = field.GetCustomAttribute<DatabaseFieldAttribute>(); if (databaseFieldAttribute != null) { fieldName = databaseFieldAttribute.FieldName; } databaseFields.Add(field.Name, fieldName); } return databaseFields; } } // 自定义属性,用于标记实体类中的字段对应的数据库字段名 [AttributeUsage(AttributeTargets.Field)] public class DatabaseFieldAttribute : Attribute { public string FieldName { get; } public DatabaseFieldAttribute(string fieldName) { FieldName = fieldName; } } ``` 使用示例: ```csharp public class User { [DatabaseField("id")] public int Id; [DatabaseField("username")] public string Username; [DatabaseField("password")] public string Password; } var databaseFields = DatabaseUtility.GetDatabaseFields("User", "u_"); foreach (var pair in databaseFields) { Console.WriteLine($"Entity field {pair.Key} maps to database field {pair.Value}."); } // 输出: // Entity field Id maps to database field u_id. // Entity field Username maps to database field u_username. // Entity field Password maps to database field u_password. ``` 注意:上述代码中使用了自定义属性 `DatabaseFieldAttribute`,可以根据实际情况进行修改。如果没有自定义属性,可以约定俗成地将实体类字段名转为小写,然后添加下划线前缀作为数据库字段名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值