定义通用的可通过lambda表达式树来获取属性信息

简介:

我们一般获取某个类型或对象的属性信息均采用以下几种方法:

1
2
3
4
5
6
7
8
一、通过类型来获取属性信息
var  p=  typeof (People).GetProperty( "Age" ); //获取指定属性
var  ps =  typeof (People).GetProperties(); //获取类型的所有属性
 
二、通过实例来获取属性信息
People people =  new  People();
var  pro = people.GetType().GetProperty( "Age" );
var  pros = people.GetType().GetProperties();

这两种方法都有其弊端,第一种与第二种方法,在获取单个属性信息时,都需要硬编码写入常量属性名称,这样在编译时并不会报错,只有在运行时才知道异常,第二种方法若只是需要获取属性的类型名称等基本信息,不需要属性的值,就不需要实例化类型。

鉴于以上原因,我定义了通用的可通过lambda表达式树来获取属性信息,使用方便,能解决上述问题,且有智能提示,若出现错误,编译时就能报出,方法定义代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/// <summary>
/// 获取指定属性信息(非String类型存在装箱与拆箱)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="select"></param>
/// <returns></returns>
public  static  PropertyInfo GetPropertyInfo<T>(Expression<Func<T,dynamic>>  select )
{
     var  body =  select .Body;
     if  (body.NodeType == ExpressionType.Convert)
     {
         var  o = (body  as  UnaryExpression).Operand;
         return  (o  as  MemberExpression).Member  as  PropertyInfo;
     }
     else  if  (body.NodeType == ExpressionType.MemberAccess)
     {
         return  (body  as  MemberExpression).Member  as  PropertyInfo;
     }
     return  null ;
}
 
/// <summary>
/// 获取指定属性信息(需要明确指定属性类型,但不存在装箱与拆箱)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="TR"></typeparam>
/// <param name="select"></param>
/// <returns></returns>
public  static  PropertyInfo GetPropertyInfo<T, TR>(Expression<Func<T, TR>>  select )
{
     var  body =  select .Body;
     if  (body.NodeType == ExpressionType.Convert)
     {
         var  o = (body  as  UnaryExpression).Operand;
         return  (o  as  MemberExpression).Member  as  PropertyInfo;
     }
     else  if  (body.NodeType == ExpressionType.MemberAccess)
     {
         return  (body  as  MemberExpression).Member  as  PropertyInfo;
     }
     return  null ;
}
 
/// <summary>
/// 获取类型的所有属性信息
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="select"></param>
/// <returns></returns>
public  static  PropertyInfo[] GetPropertyInfos<T>(Expression<Func<T,dynamic>>  select )
{
     var  body =  select .Body;
     if  (body.NodeType == ExpressionType.Parameter)
     {
        return  (body  as  ParameterExpression).Type.GetProperties();
     }
     else  if (body.NodeType==ExpressionType.New)
     {
         return  (body  as  NewExpression).Members.Select(m => m  as  PropertyInfo).ToArray();
     }
     return  null ;
}

使用很简单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// People类型定义
class  People
     {
         public  string  Name
         get set ; }
 
         public  int  Age
         get set ; }
 
         public  string  Sex
         get set ; }
 
         public  bool  IsBuyCar
         get set ; }
 
         public  DateTime? Birthday
         get set ; }
     }
 
 
//以下是使用方法:
 
var  p = GetPropertyInfo<People>(t => t.Age); //获取指定属性
var  ps1 = GetPropertyInfos<People>(t => t); //获取类型所有属性
var  ps2 = GetPropertyInfos<People>(t =>  new  { t.Name, t.Age }); //获取部份属性

  

注意dynamic类型也存在装箱与拆箱的问题,详见这篇博文:http://www.cnblogs.com/yank/p/4177619.html

本文转自 梦在旅途 博客园博客,原文链接: http://www.cnblogs.com/zuowj/p/4452046.html  ,如需转载请自行联系原作者
相关文章
|
存储 机器人 Windows
|
5月前
|
数据安全/隐私保护 C++
C++ 中的类是一种用户定义的数据类型,用于表示具有相似特征和行为的对象的模板。
C++ 中的类是一种用户定义的数据类型,用于表示具有相似特征和行为的对象的模板。
|
6月前
|
JSON API 数据库
使用现代方式定义接口
【5月更文挑战第14天】FastAPI是一个现代化的、基于类型的web框架,用于构建API。它支持自动补全和类型检查,提供数据校验并能自动生成清晰的错误消息。 它基于OpenAPI标准,能自动生成交互式Swagger UI和ReDoc文档。 FastAPI内置安全性特性,支持身份验证,如HTTP基本认证和OAuth2。依赖注入系统使得复杂逻辑易于管理,同时兼容Starlette,具备高性能、WebSocket和GraphQL支持。
182 0
|
6月前
|
存储 API
功能定义
功能定义.
203 1
功能定义
|
6月前
|
JavaScript 前端开发 编译器
TypeScript【可选属性、只读属性、额外的属性检查、函数类型、类类型、继承接口】(四)-全面详解(学习总结---从入门到深化)
TypeScript【可选属性、只读属性、额外的属性检查、函数类型、类类型、继承接口】(四)-全面详解(学习总结---从入门到深化)
69 0
|
监控 安全 网络安全
CWPP与EDR的定义与区别
随着信息系统的发展,大家都在说网络安全要覆盖“云”、“管”、“端”,CWPP与EDR是目前非常火的产品,一个面向云端服务器的防护,一个是面向常规终端PC端的防护。
2100 0
Lambda表达式实现方式、标准格式、练习、省略模式、注意事项及和匿名内部类的区别
Lambda表达式实现方式、标准格式、练习、省略模式、注意事项及和匿名内部类的区别
127 0
记录几个经常用到的泛型方法定义模板
记录几个经常用到的泛型方法定义模板
76 0
方法的定义与使用
在程序之中很多情况下是有可能需要重复执行一些代码的。在一些书上也把方法称为函数。
77 0
方法的定义与使用
方法的定义
方法的定义
174 0
下一篇
无影云桌面