根据属性获取属性名

大家所熟知的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与数据库表字段一一对应的,那么拼接的时候就不用在去数据库中寻找字段,并复制过来,能提升一些开发的效率吧!这只是个人的一点开发经历,如果有不同看法的可以想我提出来,我们共同参考!

原文地址:https://www.cnblogs.com/jx0906/p/2971091.html