C# 使用表达式树获取特性的值
一、定义特性
/// <summary>
/// 定义特性
/// </summary>
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Class | AttributeTargets.Property, AllowMultiple = false)]
public class DataMember : Attribute
{
public string Name { get; set; } public string Type { get; set; } }
二、创建工具类
利用泛型类得知要获取那个类上成员特性的类型,这样就能用Lambda表达式了。Expression.Body读取时是 System.Linq.Expressions.PropertyExpression 类型,找不到断点中Member属性。所以需要转换成 System.Linq.Expressions.MemberExpression 类型
/// <summary>
/// 获取特性工具类
/// </summary>
/// <typeparam name="T"></typeparam>
public static class AttrTool<T>
{
/// <summary>
/// 获取特性Name属性
/// </summary>
/// <typeparam name="Result"></typeparam>
/// <param name="expression"></param>
/// <returns></returns>
public static string DataMemberName<Result>(Expression<Func<T, Result>> expression)
{
var body = expression.Body as MemberExpression;
var attr = body.Member.CustomAttributes.FirstOrDefault(t => t.AttributeType == typeof(DataMember));
var property = attr.NamedArguments.FirstOrDefault(t => t.MemberName == "Name");
return property.TypedValue.Value.ToString();
}
/// <summary>
/// 获取特性Type属性
/// </summary>
/// <typeparam name="Result"></typeparam>
/// <param name="expression"></param>
/// <returns></returns>
public static string DataMemberType<Result>(Expression<Func<T, Result>> expression)
{
var body = expression.Body as MemberExpression;
var attr = body.Member.CustomAttributes.FirstOrDefault(t => t.AttributeType == typeof(DataMember));
var property = attr.NamedArguments.FirstOrDefault(t => t.MemberName == "Type");
return property.TypedValue.Value.ToString();
} }
三、定义测试模型及调用
class Program
{ static void Main(string[] args)
{ var temp = AttrTool<AttrModel>.DataMemberName(t => t.Name);
Console.WriteLine();
}
} /// <summary>
/// 测试模型
/// </summary>
public class AttrModel
{
[DataMember(Name = "this is Test", Type = "string")]
public string Name { get; set; }
}
C# 使用表达式树获取特性的值的更多相关文章
- C# 通过反射获取特性的值
特性(Attribute)是用于在运行时传递程序中各种元素(比如类.方法.结构.枚举.组件等)的行为信息的声明性标签.您可以通过使用特性向程序添加声明性信息.一个声明性标签是通过放置在它所应用的元素前 ...
- [C#] C# 知识回顾 - 表达式树 Expression Trees
C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...
- C# 知识回顾 - 表达式树 Expression Trees
C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...
- C#3.0新特性:隐式类型、扩展方法、自动实现属性,对象/集合初始值设定、匿名类型、Lambda,Linq,表达式树、可选参数与命名参数
一.隐式类型var 从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,编译器自动推断类型. 1.var类型的局部变量必须赋予初始值,包括匿名 ...
- 定义通用的可通过lambda表达式树来获取属性信息
我们一般获取某个类型或对象的属性信息均采用以下几种方法: 一.通过类型来获取属性信息 var p= typeof(People).GetProperty("Age");//获取指定 ...
- 转载:C#特性-表达式树
原文地址:http://www.cnblogs.com/tianfan/ 表达式树基础 刚接触LINQ的人往往觉得表达式树很不容易理解.通过这篇文章我希望大家看到它其实并不像想象中那么难.您只要有普通 ...
- C#特性-表达式树
表达式树ExpressionTree 表达式树基础 转载需注明出处:http://www.cnblogs.com/tianfan/ 刚接触LINQ的人往往觉得表达式树很不容易理解.通过这篇文章我希 ...
- 不能不说的C#特性-表达式树
不能不说的C#特性-表达式树 2008-09-18 00:00 by 横刀天笑, 17112 阅读, 14 评论, 收藏, 编辑 最近发生了很多很多事情,频繁的搬家.工作上的事情也挺多的,所以博客更新 ...
- 表达式树练习实践:C#值类型、引用类型、泛型、集合、调用函数
目录 表达式树练习实践:C#值类型.引用类型.泛型.集合.调用函数 一,定义变量 二,访问变量/类型的属性字段和方法 1. 访问属性 2. 调用函数 三,实例化引用类型 四,实例化泛型类型于调用 五, ...
随机推荐
- How do I duplicate a resource reference in code behind in WPF?如何在WPF后台代码中中复制引用的资源?
原文 https://stackoverflow.com/questions/28240528/how-do-i-duplicate-a-resource-reference-in-code-behi ...
- Windows NT WinLogon Notify
在NT系列Windows操作系统中,恶意软件可以通过关联Winlogon特定的事件来使自身被启动,如Lock,Logoff,Logon,Shutdown,StartScreenSaver,StartS ...
- TLD单目标跟踪算法程序详解--OpenTLD Code 详解
TLD算法原理介绍:http://www.cnblogs.com/liuyihai/p/8306419.html OpenTLD源代码页: https://github.com/zk00006/Ope ...
- 微信小程序把玩(二十四)toast组件
原文:微信小程序把玩(二十四)toast组件 toast消息提示框,可用在提示一些信息,比如清楚缓存给用户一个友好的提示!或操作一些请求不想让用户有什么操作,toast也可以做到因为toast显示时其 ...
- Sql 2017 安装到sql_shared_mrconfigaction-install-confignonrc-cpu64卡住不动问题
解决方法:取消功能选择的实例功能和共享功能中的"机器学习服务(数据库内)""机器学习服务器(独立)"
- C# 遍历窗体控件顺序问题
今天在做C# winform 窗体控件遍历时遇到控件顺序的问题,也就是控件被遍历的先后问题.实际情况如下所述. 窗体界面如下: 界面构成是:主界面有一个 Panel (Panel_14),Panel_ ...
- R3 HOOK OpenProcess 的问题
unit HookAPI; //Download by http://www.codefans.net interface uses Windows, Classes; function Locate ...
- qt在windows下的udp通信(最简单)
qt编程:windows下的udp通信 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:win7 开发环境:qt 功能: 用udp进行收发 ...
- WebP 极限压缩及ios实现
WebP 极限压缩及ios实现 Levi.duan 会议提纲 概念以及定义 什么是Webp ? WebP (发音 weppy ),是一种同时提供了有损压缩与无损压缩的图片文件格式,是Google新 ...
- dpkg:处理 xxx (--configure)时出错解决方案
出现问题如下: 正在设置 nfs-common (1:1.2.2-4ubuntu5) ... dpkg:处理 nfs-common (--configure)时出错: 子进程 已安装 post-in ...