首先定义一个特性(attribute)。我会将这个特性放到需要自动加载和保存的属性上,以便将这些需要处理的属性从所有的页面属性中筛选出来,做进一步处理。这个特性的定义如下:
/// <summary>/// 自动保存属性. 能够实现字段或属性值的自动保存和加载. 该属性只在非静态字段或属性上才能生效./// </summary>/// <remarks>
/// 自动保存属性. 在页面类的属性上面加上该属性. 可以使得该字段或属性能够自动保存和自动加载.
/// 但是该属性必须是可序列化的. 否则抛出异常. 该属性只在非公有字段或属性上才能生效.
/// </remarks>[attributeusage(attributetargets.property | attributetargets.field, allowmultiple = false, inherited = false)]public class autosaveattribute : attribute{/// <summary>/// 初始化创建一个 <see cref="autosaveattribute"/> 类的实例. 使得具有该属性的类的属性具有自动保存的特性./// </summary>public autosaveattribute() { }}
然后就是重写页面生命周期的某些事件,加入我们的处理代码。处理的过程为:㈠检索当前页面类型并将其需要处理的属性筛选出来(初始化过程);㈡将筛选出来的属性做保存或赋值操作(关键点)。
㈠筛选需要处理的属性,将其缓存到一个静态字典中,在需要的时候再取出来。这个初始化的代码如下:
/// <summary>/// 用户控件类型及自动保存属性成员缓冲字典/// </summary>protected static dictionary<type, memberinfo[]> cachedic = null;/// <summary>/// 获得成员列表的绑定标识./// </summary>protected static bindingflags flag;/// <summary>/// 初始化 <see cref="basepage"/> 类./// </summary>static basepage(){cachedic = new dictionary<type, memberinfo[]>();flag = bindingflags.public | bindingflags.nonpublic | bindingflags.instance | bindingflags.getfield | bindingflags.getproperty | bindingflags.flattenhierarchy;}/// <summary>/// 当前页面的类型/// </summary>protected type currtype = null;/// <summary>/// 初始化当前页面的缓冲字典/// </summary>protected void initcachedic(){// 获得当前实例类型currtype = page.gettype();memberinfo[] mems = null;if (!cachedic.trygetvalue(currtype, out mems)){// 自动保存属性处理var list = currtype.getmembers(flag).where(p => attribute.isdefined(p, typeof(autosave), false)).toarray();cachedic[currtype] = list;}}
可以看到,在调用调用初始化函数 initcachedic 时,系统会做两件事:缓存当前页面类型、筛选需要处理的属性。筛选属性反射操作,执行一次后不再重复。
首页 1 2 末页
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索实例
, 缓存
, static
, null
, 属性
类型
,以便于您获取更多的相关知识。
时间: 2024-09-20 00:23:44