定义一个DataMemberManager,用来遍历Type,获取所有字段和属性的,实现如下:
internal static class DataMemberManager
{
/// <summary>
/// 获取实例字段/属性集合
/// </summary>
/// <param name="type">类型</param>
/// <returns></returns>
public static List<DataMember> GetDataMember(Type type)
{
if (type == null)
{
throw new ArgumentNullException("type");
}
IEnumerable<PropertyMember> propertyMembers = from property in type.GetProperties(BindingFlags.Instance | BindingFlags.Public)
select new PropertyMember(property);
IEnumerable<FieldMember> fieldMembers = from field in type.GetFields(BindingFlags.Instance | BindingFlags.Public)
select new FieldMember(field);
List<DataMember> members = new List<DataMember>();
foreach(var property in propertyMembers)
{
members.Add(property);
}
foreach (var field in fieldMembers)
{
members.Add(field);
}
return members;
}
}
在前面我们定义的Handler的ProcessRequest方法中,我们调用了Executor.Execute,该方法用于执行委托,实现如下:
/// <summary>
/// 核心函数,执行Handler的方法
/// </summary>
/// <param name="page">页面对象</param>
/// <param name="context">请求上下文</param>
/// <param name="cacheMethodInfo">缓存方法原数据</param>
internal static void Execute(Page page, HttpContext context, CacheMethodInfo methodInfo)
{
if (page == null)
{
throw new ArgumentNullException("page");
}
try
{
if (methodInfo != null)
{
HttpRequest request = context.Request;
object[] parameters = GetParametersFromRequest(request, methodInfo.Parameters);
object data = methodInfo.Func(page, parameters);
int serverCache = methodInfo.AjaxMethodAttribute.ServerCache;
if (serverCache > 0)
{
CacheHelper.Insert(context, methodInfo.AjaxMethodAttribute.ServerCache, data);
}
EndCurrentRequest(context, data, methodInfo.AjaxMethodAttribute.OutputCache);
}
else
{
EndCurrentRequest(context, "找不到合适的Ajax方法!");
}
}
catch (FormatException)
{
EndCurrentRequest(context, "调用方法匹配到无效的参数!");
}
catch (InvalidCastException)
{
EndCurrentRequest(context, "参数转换出错!");
}
catch (System.Threading.ThreadAbortException)
{
//do nothing
}
catch (Exception ex)
{
EndCurrentRequest(context, ex.Message);
}
}
CacheMethodInfo我们已经获得了,现在只要获得参数我们就可以执行方法。









