1.在使用反射时,反射可以绕过安全访问级别(private、protected)修饰的类或属性,来获取需要的信息。

2.泛型的反射:可以使用Type.ContainsGenericParameters这个属性来判断一个类或方法是否包含尚未设置的泛型实参,Type.IsGenericType属性表示是否为泛型类型。

3.特性(Attribute):可以使用特性修饰类、接口。结构、枚举、委托、事件、属性、字段、方法、构造器、索引器、参数、类型参数、返回值、程序集、模块,使用特性的语法有2种,可为多个“[特性类型]”或“[特性类型,特性类型]”。对于其中列出多数构造来说,都可以使用上面的语法标记,但是这个语法不适合“返回值、程序集、模块”。

(1)程序集,[assembly:特性名]。

(2)模块,[module:特性名]。

(3)返回值,[return:特性名]。

4.大多数特性只针对特定的构造进行修饰,为了避免特性不恰当的使用,可以使用[AttributeUsageAttribute(AttributeTargets.xxx)]特性类进行标记特性限制。

5.具名参数:如[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]语法有别于构造器初始化语法,因为AttributeUsageAttribute类并不包含两个参数的构造器,虽然C#4.0支持命名参数,但也是指定方法本身所需的参数。具名参数是用于在特性构造器调用中设置特定的公共属性和字段,即使构造器不包含对应的参数,具名参数虽然是可选的,但它允许对特性的额外实例数据进行设置,同时无需提供一个对应的构造器参数。

6.序列化(Serializable):本质上System.Runtime,Serialization.SerializationInfo对象是由“名称/值”对构成的集合。在实现自定义的序列化时(需要实现ISerializable接口),内中会使用到SerializationInfo对象。

7.动态编程(Dynamic):反射的关键功能之一就是动态查找和调用特定类型的一个成员,这需要在执行时识别成员名或其他特征。在C#4.0中新增的动态编程-Dynamic,提供一个更简单的办法来通过反射调用成员,但这个技术的限制在于,编译时需要知道成员名和签名。若执行时发现事实上没有这个成员,调用就会引发一个RuntimeBinderException异常。可查看UseDynamic.Test()代码。

8.Dynamic:究其根本,Dynamic是一个Object,存在任何对象都能隐式转换成Dynamic,Dynamic可以显式转换成其他对象,所以Dynamic在行为上就像Object,类似于Object,它甚至为它的默认值返回null(default(dynamic))。dynamic特殊动态行为只在调用时才会出现,这个行为是它与Object区分开来的关键。任何dynamic的成员调用都会返回为dynamic类型,但若对Dynamic执行GetType(),会返回是编译好的类型(即最后赋值给动态变量的类型)。

9.实现自定义动态对象:定义自定义动态类型的关键是实现System.Dynamic.IDynamicMetaObjectProvider接口,但是不必从头实现,相反首先的方案是从System.Dynamic.DynamicObject类继承,并重写相应的方法。DynamicObject类已经实现了IDynamicMetaObjectProvider接口,提供了默认处理。可查看代码DynamicXml类,UseDynamic类中2个方法NormalMethod()与DynamicMethod()两者的比较。NormalMethod()方法使用一般的xml数据读取,DynamicMethod()方法使用了自定义动态对象解析xml内容。

[Serializable]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class MyDescriptionAttribute : Attribute
{ } public class UseDynamic
{
public static void Test()
{
dynamic data = "Hello! My name is Inigo Montoya";
Console.WriteLine(data);
data = (double)data.Length;
data = data * 3.5 + 28.6;
if (data == 2.4 + + 26.2)
{
Console.WriteLine("data for length : {0}", data);
}
else
{
data.NonExistentMethodCallStillCompiles();
}
} public static void NormalMethod()
{
XElement person = XElement.Parse("<Person><Name>主神</Name><Age>26</Age></Person>");
Console.WriteLine("{0},{1}", person.Descendants("Name").FirstOrDefault().Value, person.Descendants("Age").FirstOrDefault().Value);
} public static void DynamicMethod()
{
dynamic person = DynamicXmL.Parse("<Person><Name>主神</Name><Age>26</Age></Person>");
Console.WriteLine("{0},{1}", person.Name, person.Age);
}
} /// <summary>
/// 实现自定义的动态对象
/// </summary>
public class DynamicXmL : DynamicObject
{
private XElement element; public DynamicXmL(XElement xElement)
{
element = xElement;
} public static dynamic Parse(string text)
{
return new DynamicXmL(XElement.Parse(text));
} public override bool TryGetMember(GetMemberBinder binder, out object result)
{
bool success = false;
result = null;
XElement firstDescendant = element.Descendants(binder.Name).FirstOrDefault();
if (firstDescendant != null)
{
if (firstDescendant.Descendants().Count() > )
{
result = new DynamicXmL(firstDescendant);
}
else
{
result = firstDescendant.Value;
}
success = true;
}
return success;
} public override bool TrySetMember(SetMemberBinder binder, object value)
{
bool success = false;
XElement firstDescendant = element.Descendants(binder.Name).FirstOrDefault();
if (firstDescendant != null)
{
if (value.GetType() == typeof(XElement))
{
firstDescendant.ReplaceWith(value);
}
else
{
firstDescendant.Value = value.ToString();
}
success = true;
}
return success;
}
}

-----------------以上内容根据《C#本质论 第三版》进行整理

C#学习笔记12的更多相关文章

  1. Ext.Net学习笔记12:Ext.Net GridPanel Filter用法

    Ext.Net学习笔记12:Ext.Net GridPanel Filter用法 Ext.Net GridPanel的用法在上一篇中已经介绍过,这篇笔记讲介绍Filter的用法. Filter是用来过 ...

  2. SQL反模式学习笔记12 存储图片或其他多媒体大文件

    目标:存储图片或其他多媒体大文件 反模式:图片存储在数据库外的文件系统中,数据库表中存储文件的对应的路径和名称. 缺点:     1.文件不支持Delete操作.使用SQL语句删除一条记录时,对应的文 ...

  3. golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题

    golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题 今天测试了重新建一个项目生成新的表,然后复制到旧的项目 ...

  4. Spring MVC 学习笔记12 —— SpringMVC+Hibernate开发(1)依赖包搭建

    Spring MVC 学习笔记12 -- SpringMVC+Hibernate开发(1)依赖包搭建 用Hibernate帮助建立SpringMVC与数据库之间的联系,通过配置DAO层,Service ...

  5. Python3+Selenium3+webdriver学习笔记12(js操作应用:滚动条 日历 内嵌div)

    #!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记12(js操作应用:滚动条 日历 内嵌div)'''from ...

  6. springmvc学习笔记(12)-springmvc注解开发之包装类型參数绑定

    springmvc学习笔记(12)-springmvc注解开发之包装类型參数绑定 标签: springmvc springmvc学习笔记12-springmvc注解开发之包装类型參数绑定 需求 实现方 ...

  7. 并发编程学习笔记(12)----Fork/Join框架

    1. Fork/Join 的概念 Fork指的是将系统进程分成多个执行分支(线程),Join即是等待,当fork()方法创建了多个线程之后,需要等待这些分支执行完毕之后,才能得到最终的结果,因此joi ...

  8. matlab学习笔记12单元数组和元胞数组 cell,celldisp,iscell,isa,deal,cellfun,num2cell,size

    一起来学matlab-matlab学习笔记12 12_1 单元数组和元胞数组 cell array --cell,celldisp,iscell,isa,deal,cellfun,num2cell,s ...

  9. SpringMVC:学习笔记(12)——ThreadLocal实现会话共享

    SpringMVC:学习笔记(12)——ThreadLocal实现会话共享 ThreadLocal ThreadLocal,被称为线程局部变量.在并发编程的情况下,使用ThreadLocal创建的变量 ...

  10. Spring源码学习笔记12——总结篇,IOC,Bean的生命周期,三大扩展点

    Spring源码学习笔记12--总结篇,IOC,Bean的生命周期,三大扩展点 参考了Spring 官网文档 https://docs.spring.io/spring-framework/docs/ ...

随机推荐

  1. vs更改项目文件夹名称

    改完之后会提示找不到.csproj,用文档工具打开.sln文件,把里面找.csproj的路径修改一下就好了

  2. 【ARC080F】Prime Flip 差分+二分图匹配

    Description ​ 有无穷个硬币,初始有n个正面向上,其余均正面向下.  你每次可以选择一个奇质数p,并将连续p个硬币都翻转.  问最小操作次数使得所有硬币均正面向下. Input ​ 第一行 ...

  3. linux防火墙(一)—— iptables架构介绍

    一.防火墙的分类 一般宏观来说,防火墙分为主机型防火墙,例如我们为了防止个人电脑被攻击,而开启的防火墙,还分为网关型防火墙,一般部署在企业的网关,用于过滤和转发,保证整个企业的网络环境安全性. 按照物 ...

  4. 使用@符号让C#中的保留字做变量名的方法详解

    原来还有一种办法就是加@符号(看了@符号的作用又多了一个): 复制代码代码如下: class @int    {        static void Main(string[] args)      ...

  5. c语言数据结构学习心得——栈

    栈(Stack) 只允许在一端进行插入或删除操作的线性表 栈顶(Top):栈中允许进行插入和删除操作的那一端: 栈底(Bottom):固定的,不允许进行插入或删除的另一端 1.栈是受限的线性表,所以自 ...

  6. 蓝牙4.0BLE抓包(三) – 扫描请求和扫描响应

    版权声明:本文为博主原创文章,转载请注明作者和出处.    作者:强光手电[艾克姆科技-无线事业部] 1. 扫描请求和扫描响应 广播包含扫描请求SCAN_REQ和扫描响应SCAN_RSP. 扫描请求: ...

  7. fiddler抓安卓

    1.tools connections  左 allow remote computersconnect  选中 2.配置模拟器 wifi 长按 修改网络 ip电脑ip 端口8888 ps:修改完不要 ...

  8. ggplot你不知道的细节

    例一 Michaelis-Menten动力学方程 这个例子中采用出自文献中的一组有关于浮萍氮摄取的数据,共2两个变量8个观测值,其中底物浓度与浮萍的氮取速率之间可以通过M-M动力学方程来进行描述.在这 ...

  9. python之函数(一)

    python有很多内置函数,可以直接调用.比如type(), len(), range(),max(), min(), filter().内置函数我们就先不多提,我们主要介绍自定义函数. 1. 函数的 ...

  10. 【KMP】洛谷P2375 [NOI2014]动物园 题解

        一开始的方向应该对了,但是没有想到合理的优化还是没写出来…… 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己 ...