asp.net 高级应用 特性Attribute ( 声明,原理,扩展,AOP)
特性attribute: 修饰作用
attribute声明,标识,生效,原理,扩展,aop思想的体现;
attribute声明:[]放在方法上,或类上,属性上,起修饰作用
1.常见的特性(你知道特性吗?用过吗?你知道的特性举例说明一下):
[Obsolete(“请使用xxx代替”,ture)]://影响编译器
[Serialize]//序列化
[httpPost]
[httpGet]//mvc webapi
[webMethod]//webservice 只有加了这个标记,才可以做为webservice接口使用
[ServiceContract]//wcf
[DependencyInjection]//IOC
[Required table key]//ORM
2.特性有什么用?
只有加了这个标记,才可以做为xxx接口使用,否则外部不能识别。
3.为什么加了此特性,会被发现为服务?
a>特性attribute:就是一个类,直接,间接继承自Attribute,一般以attribute结尾,标记时可以省略
b>特性有什么用:声明--标记
给属性添加特性后,在属性内部产生了一个.custom的元素;
ILSPY :反编译工具
IL:编译的中间语言,看IL能更深刻理解C#代码
c>特性是怎么生效的?
c#反射reflection 可以获取并使用metadata,在程序运行额过程中通过反射,可以检测到特性,获取特性实例,使用特性的实例;
d>ServiceContract为什么可以变成服务呢?
ServiceContract标记到接口,检测ServiceContract特性,有才展示,没有的不展示;
特性attribute本身没有价值,必须在程序运行的过程中,用反射主动发现并使用才有价值;
4>AOP 面向切面编程;
在不破坏封装的前提下,去增加额外的功能;
调用别人的接口返回的数据MODEL想转换为自己的MODEL(数据库MODEL,页面viewmodel)
一个类转换为另一个类model
1.利用反射 转换: 一个类转换为另一个类model
StudentDto dto=Trans<Student,Studentdto>(student);
PeopleDto dto=Trans<People,PeopleDto>(people);
private static Tout Trans<Tin,Tout>(Tin,tin)
{
Type typeOut=typeof(Tout);
Type typeIn=typeof(Tin);
Tout tout=(Tout)Activator.CreateInstance(typyOut);
//属性
foreach(var pro in typeOut.GetProperties()){
PropertyInfo propIn=typeIn.GetProperties(prop.Name);
object ovalue=propin.GetValue(tin);
prop.SetValue(tout,ovalue);
}
//字段
foreach(var field in typeOut.GetFields()){
FieldInfo fieldIn=typeIn.GetField(field.Name);
object ovalue=fieldIn.GetValue(tin);
fieldIn.SetValue(tout,ovalue);
}
return tout;
}
2.利用序列化json 转换,一个类转换为另一个类model
string sstudent=JsonConvert.SerializeObject(student);
StudentDto studentDto=JsonConvert.DeserializeObject<StudentDto>(sstudent);
3. automapper 类型转换工具,为ORM工具而生;
Mapper.Initialize(x=>x.createMap<Student,StudentDto>());
StudentDto dto=Mapper.Map<Student,StudentDto>(student);
4.动态生成硬编码,表达式目录树:expression
性能好,无法通用;通用性能不好。
new List<int>().AsQueryable().where(i=>i>5);
Func<Student,StudentDto> func=s=>new StudentDto()
{
Id=s.Id,
Name=s.Name,
Age=s.Age
};
//动态拼装目录树
相关文章
- 学习ASP.NET Core,你必须了解无处不在的“依赖注入”
- 【ASP.NET】session与cookie的比较
- ASP.NET Core中使用Protobuf从入门到实战
- .NET开源Protobuf-net组件修炼手册
- ASP.NET通过http/https的POST方式,发送和接受XML文件内容
- JavaWeb与Asp.net工作原理比较分析
- ASP.NET给图片自动添加水印
- Asp.Net Web API 2第十七课——Creating an OData Endpoint in ASP.NET Web API 2(OData终结点)
- asp.net中c# TextBox.MaxLength例子
- 在ASP.NET MVC 3 中自定义AuthorizeAttribute时需要注意的页面缓存问题
- ASP.NET Session丢失问题原因及解决方案[转]
- 【ASP.NET Core】依赖注入高级玩法——如何注入多个服务实现类
- [ASP.NET Core 3框架揭秘] Options[2]: 配置选项的正确使用方式[下篇]
- ASP.NET Core的配置(5):配置的同步[设计篇]
- ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【总体设计 】
- ASP.NET Web Pages - 文件
- ASP.NET Web Pages - 教程
- ASP.NET MVC3 Web应用程序中启用GZip压缩示例
- 10分钟学会Visual Studio将自己创建的类库打包到NuGet进行引用(net,net core,C#)
- Asp.Net Core 程序部署到Linux(centos)生产环境(二):docker部署
- asp.net core webapi Session 内存缓存
- ASP.NET MVC 开发模式(下)基础完结篇