net MyMVC框架给方法赋值的案例

  介绍

这篇文章主要介绍。净MyMVC框架给方法赋值的案例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

GetActionCallParameters的实现过程:

私有静态对象[]GetActionCallParameters (HttpContext上下文,ActionDescription行动)   {如果行动。参数==null | | action.Parameters。长度==0)返回null;object[]参数=新对象(action.Parameters.Length);for (int i=0;我& lt;action.Parameters.Length;我+ +){ParameterInfo p=action.Parameters[我];如果(p。不在)继续;如果(p。ParameterType==typeof (NameValueCollection)){如果(string.Compare (p。名称、“Form" StringComparison.OrdinalIgnoreCase)==0)   参数[我]=context.Request.Form;如果(string.Compare (p。名称、“QueryString" StringComparison.OrdinalIgnoreCase)==0)   参数[我]=context.Request.QueryString;如果(string.Compare (p。名称、“Headers" StringComparison.OrdinalIgnoreCase)==0)   参数[我]=context.Request.Headers;如果(string.Compare (p。名称、“ServerVariables" StringComparison.OrdinalIgnoreCase)==0)   参数[我]=context.Request.ServerVariables;   其他}{类型paramterType=p.ParameterType.GetRealType ();//如果参数是简单类型,则直接从HttpRequest中读取并赋值,如果(paramterType.IsSimpleType()){对象val=ModelHelper.GetValueByKeyAndTypeFrommRequest (   上下文。请求,p。名称、paramterType零);如果(val !=null)   参数[我]=val;   其他}{//自定义的类型。首先创建实例,然后给所有成员赋值。//注意:这里不支持嵌套类型的自定义类型。对象项=Activator.CreateInstance (paramterType);ModelHelper.FillModel(上下文。请求、项p.Name);   参数[我]=项目;   }   }   }返回参数;   }

要理解这段代码还要从前面的【查找行动的过程】说起,在那个阶段,可以获取一个行动的描述,具体在框架内部表示为ActionDescription类型:

内部密封类ActionDescription: BaseDescription{公共ControllerDescription PageController;//为PageAction保留公共MethodInfo MethodInfo{得到;私人设置;公共ActionAttribute Attr}{得到;私人设置;{}公共ParameterInfo[]参数得到;私人设置;公共bool HasReturn}{得到;私人设置;}公共ActionDescription (MethodInfo m, ActionAttribute atrr):基础(m)   {这个。MethodInfo=m;这一点。Attr=atrr;这一点。参数=m.GetParameters ();这一点。HasReturn=m。ReturnType !=ReflectionHelper.VoidType;   }   }

在构造函数的第三行代码中,我就可以得到这个方法的所有参数情况。
然后,我在就可以在GetActionCallParameters方法中,循环每个参数的定义,为它们赋值。
这段代码也解释了前面所说的只支持4种NameValueCollection集合的原因。

注意了,我在获取每个参数的类型时,是使用了下面的语句:

类型paramterType=p.ParameterType.GetRealType ();

实际上,ParameterType就已经反映了参数的类型,为什么不直接使用它呢?
答:因为【可空泛型】的原因。这个类型我们需要特殊的处理。
例如:如果某个参数是这样声明的:int ?id
那么,即使在查询字符串中包含id这样一个参数,我也不能直接转成int ?使用这种类型,必须得到它的【实际类型】。
GetRealType()是个扩展方法,它就专门完成这个功能:

///& lt; summary>///得到一个实际的类型(排除Nullable类型的影响)。比如:int ?最后将得到int///& lt;/summary>///& lt;参数name=皌ype"祝辞& lt;/param>///& lt; returns> & lt;/returns>公共静态类型GetRealType(这种类型)   {如果(类型。IsGenericType)返回Nullable.GetUnderlyingType(类型)? ?类型;其他的   返回类型;   }

如果某个参数的类型是一个自定义的类型,框架会先创建实例(调用无参的构造函数),然后给它的属性,字段赋值。

注意了:自定义的类型,一定要提供一个无参的构造函数。

为自定义类型的实例填充数据成员的代码如下:

内部静态类ModelHelper{公共静态只读的bool IsDebugMode;静态ModelHelper ()   {CompilationSection configSection=ConfigurationManager.GetSection(“包含/compilation") CompilationSection;如果(configSection !=null)   IsDebugMode=configSection.Debug;   }///& lt; summary>///根据HttpRequest填充一个数据实体。///这里不支持嵌套类型的数据实体,且要求各数据成员都是简单的数据类型。///& lt;/summary>///& lt;参数name=皉equest"祝辞& lt;/param>///& lt;参数name=癿odel"祝辞& lt;/param>公共静态孔隙FillModel (HttpRequest请求,对象模型,字符串paramName)   {ModelDescripton descripton=ReflectionHelper.GetModelDescripton (model.GetType ());对象val=零;在descripton foreach(数据成员字段。字段){//这里的实现方式不支持嵌套类型的数据实体。//如果有这方面的需求,可以将这里改成递归的嵌套调用。瓦尔=GetValueByKeyAndTypeFrommRequest (   请求,领域。名字,field.Type.GetRealType (), paramName);如果(val !=null)   字段。SetValue(模型,val);   }   }///& lt; summary>///读取一个HTTP参数值。这里只读取变量以及形式///& lt;/summary>///& lt;参数name=皉equest"祝辞& lt;/param>///& lt;参数name=発ey"祝辞& lt;/param>///& lt; returns> & lt;/returns>公共静态字符串GetHttpValue (HttpRequest请求字符串键)   {字符串val=request.QueryString(例子);如果(val==null)   val=request.Form(例子);返回val;   }   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

net MyMVC框架给方法赋值的案例