获取强类型检测的属性名

在使用EF的Codefirst时,由于EF的局限性,不得不让我们去拼一些查询语句,如下:

string sql = string.Format("select ID,[Name] from User");。。。
但是这样的代码是没有类型检测的,比如某天项目经理强迫症犯了,将User实体类的“ID”改成”UserID“,那么程序就会报查询异常错误。那怎么做到强类型检测呢?
方法一(推荐):
using System.Linq.Expressions;  
/*************************************************************************
*GUID:0caf04be-5cbd-42fd-8294-fdffc5f9f52e 
*Author:[email protected]
*Code Caption:
***************************************************************************/
namespace System
{
    /// <summary>
    /// 获取强类型检测的属性名
    /// </summary>
    public static class Strong
    {
        public static string PropertyName<T>(Expression<Func<T, object>> exp)
        {
            string result = string.Empty;
            if (exp.Body is UnaryExpression)
            {
                result = ((MemberExpression)((UnaryExpression)exp.Body).Operand).Member.Name;
            }
            else if (exp.Body is MemberExpression)
            {
                result = ((MemberExpression)exp.Body).Member.Name;
            }
            else if (exp.Body is ParameterExpression)
            {
                result = ((ParameterExpression)exp.Body).Type.Name;
            }
            return result;
        }
    }
}

 调用:(现在不管你谁怎么修改实体,我都不用再去打理它了)
           string id=Strong.PropertyName<User>(x=>x.UserID);

string name=Strong.PropertyName<User>(x=>x.Name);

string sqls = string.Format("select {0},{1} from User",id,name);

 
方法二:该方法就有点笨拙了,不过也不失为一种坚决方案。
namespace System
{
    public static class SystemExtend
    {
        /// <summary>
        ///获取强类型检测的属性名称
        /// </summary>
        /// <param name="t">对象类型</param>
        /// <param name="propertyName">属性名称</param>
        /// <returns>强类型检测的属性名称</returns>
        public static string StrongProperty(this Type t, string propertyName)
        {
            if (t.IsClass)
            {
                try
                {
                    return t.GetProperty(propertyName).Name;
                }
                catch (Exception)
                {
                    throw new Exception(string.Format("请检查\"{0}\"是否为类\"{1}\"的有效属性", propertyName, t.Name));
                }
            }
            else
            {
                throw new Exception(string.Format("\"{0}\"不是有效的类!", t.Name));
            }
        }
    }

调用:

    Type t=typeof(User);
    string sql = string.Format("select {0},{1} from User",t.StrongProperty("UserID"),t.StrongProperty("Name"));

现在修改代码,再也不用怕到投鼠忌器了!!!

获取强类型检测的属性名

时间: 2024-10-09 21:26:52

获取强类型检测的属性名的相关文章

php : 获取对象的属性名

方案有多种: 一. 使用 get_object_vars() 方法 缺点: 只能显示 public 的 //只显示public的 var_dump(get_object_vars($test)); 处理: 在类中定义一个public 的方法, 外部对象调用即可显示所有属性(除了静态属性之外) function showAllProperties2(){ var_dump(get_object_vars($this)); } 二. 使用ReflectionClass类 能够获取所有的属性名 //显

C# 使用反射获取类的成员变量名、方法及属性的若干笔记

参考链接:http://blog.csdn.net/ccaakkee/article/details/2425950,作者:CSDN ccaakkee   http://blog.csdn.net/jaydawson/article/details/5539438,作者:CSDN jaydawson 代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sys

SpringBoot08 请求方式、参数获取注解、参数验证、前后台属性名不一致问题、自定义参数验证注解、BeanUtils的使用

1 请求方式 在定义一个Rest接口时通常会利用GET.POST.PUT.DELETE来实现数据的增删改查:这几种方式有的需要传递参数,后台开发人员必须对接收到的参数进行参数验证来确保程序的健壮性 1.1 GET 一般用于查询数据,采用明文进行传输,一般用来获取一些无关用户信息的数据 1.2 POST 一般用于插入数据 1.3 PUT 一般用于数据更新 1.4 DELETE 一般用于数据删除 技巧01:一般都是进行逻辑删除(即:仅仅改变记录的状态,而并非真正的删除数据) 2 参数获取注解 2.1

java 反射机制--根据属性名获取属性值

1.考虑安全访问范围内的属性,没有权限访问到的属性不读取 [java] view plain copy /** * 根据属性名获取属性值 * * @param fieldName * @param object * @return */ private String getFieldValueByFieldName(String fieldName, Object object) { try { Field field = object.getClass().getField(fieldName

C#通过属性名字符串获取、设置对象属性值

目录 #通过反射获取对象属性值并设置属性值 #获取对象的所有属性名称及类型 #判断对象是否包含某个属性 #通过反射获取对象属性值并设置属性值 0.定义一个类 public class User { public int Id { get; set; } public string Name { get; set; } public string Age { get; set; } } 1.通过属性名(字符串)获取对象属性值 User u = new User(); u.Name = "lily&

241 获取对象的属性名:Object.keys(对象)

Object.keys(对象) :获取到当前对象中的属性名 ,返回值是有元素为字符串的一个数组,效果类似 for-in. <script> // 用于获取对象自身所有的属性 var obj = { id: 1, pname: '小米', price: 1999, num: 2000 }; var arr = Object.keys(obj); console.log(arr); // ["id", "pname", "price",

ibernate学习笔记5---实体类或属性名与数据库关键字冲突、hql命名参数、hql实现通用分页

一.实体类或属性名与数据库关键字冲突问题1.实体类名与数据库中的关键字冲突比如:实体表User与oracle中的系统表冲突解决方式1:在xml中添加table属性,指定表名,使其不与name默认相等 [html] view plaincopyprint? <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hiber

C#基础系列:开发自己的窗体设计器(PropertyGrid显示中文属性名)

既然是一个窗体设计器,那就应该能够设置控件的属性,设置属性最好的当然是PropertyGrid了,我们仅仅需要使用一个PropertyGrid.SelectedObject = Control就可以搞定,让PropertyGrid显示Control的所有属性.可是这里显示的属性名是英文的.对于我们开发人员来说这无可厚非,我们也乐于接受.并且让PropertyGrid显示中文属性名,这对于我们开发人员的使用来说显得多此一举.可是,对于我这种类型的一个应用工具,英文属性名对于很多客户来说可能就很难懂

获取文件的详细属性,大小,修改日期,所在位置等

asp.net 获得文件属性中的修改时间,获得系统文件属性的方法,最后一次写入时间 1 #region 获取文件的详细属性,大小,修改日期,所在位置等 2 /// <summary> 3 /// 获取文件的详细属性,大小,修改日期,所在位置等 4 /// </summary> 5 /// <param name="files">文件的路径</param> 6 /// <returns></returns> 7 pu