根据属性获取属性名
大家所熟知的WinForm的DataGridView绑定数据方式基本上就是使用Rows.Add来进行添加数据,这样有一个不好的是,重新查询的时候要将Rows.Clear了,不然会重复添加,还有如果列的位置更换了,那么它的显示位置就错乱,展示出的数据不明确,所以本人不提倡此方法!还有一种就是给它的DataSource属性绑定数据,可以用DataTable类型或者List类型等进行绑定,但是必须要设置每个列的DataPropertyName属性,这个属性的意思是与数据对象的那个属性进行绑定。如果是List的话那么可以直接将对象的属性赋予DataPropertyName,但是DataTable的话就得知道DataTable中的列名才能进行绑定,这样的话在开发当中总要到MSSqlServer中去查看列名,开发速度上会相对慢一些,所以我就想可不可以根据对象的属性来返回属性名呢?经过我多番的网上搜索,找到了正确的答案,答案是可以的,那么是怎么的实现的呢?下面我来解释,请先看代码:
1 /// <summary> 2 /// 根据属性获取对应的属性名称 3 /// </summary> 4 /// <typeparam name="T">对象类型</typeparam> 5 /// <typeparam name="K">对象数据的类型</typeparam> 6 /// <param name="t">对象</param> 7 /// <param name="expr">需要获取的属性</param> 8 /// <returns>属性名</returns> 9 public static string GetPropertyName<T, K>(this T t, Expression<Func<T, K>> expr) 10 { 11 string propertyName = string.Empty; //返回的属性名 12 //对象是不是一元运算符 13 if (expr.Body is UnaryExpression) 14 { 15 propertyName = ((MemberExpression)((UnaryExpression)expr.Body).Operand).Member.Name; 16 } 17 //对象是不是访问的字段或属性 18 else if (expr.Body is MemberExpression) 19 { 20 propertyName = ((MemberExpression)expr.Body).Member.Name; 21 } 22 //对象是不是参数表达式 23 else if (expr.Body is ParameterExpression) 24 { 25 propertyName = ((ParameterExpression)expr.Body).Type.Name; 26 } 27 return propertyName; 28 }
调用
1 orderId.DataPropertyName = os.GetPropertyName(p => p.OrderId);
上述方法是一个扩展方法,代码中T表示的是对象的类型,K是对象的类型的具体数据的类型。Expression<Func<T, K>>表示的需要转换的表达式。
有人可能觉得这样使用是不是会很繁琐,但是细细品味这样做也有一定的好处,那就是不用在开发当中频繁的在数据库与开发环境来回切换了。这个方法的另一种使用方式是在拼接sql字符串语句的时候会频繁使用,因为现在的开发项目都是Model与数据库表字段一一对应的,那么拼接的时候就不用在去数据库中寻找字段,并复制过来,能提升一些开发的效率吧!这只是个人的一点开发经历,如果有不同看法的可以想我提出来,我们共同参考!