GetParameterFromRequest用于从请求获取object[]参数数组。根据上面所说的,如果参数是一个简单类型,那么直接进行转换;如果是实例对象,那么我们先要创建new一个实例对象,然后为其字段或属性赋值。实现如下:
/// <summary>
/// 从请求获取参参数
/// </summary>
/// <param name="request">HttpRequest</param>
///<param name="parameters">参数信息</param>
/// <returns>参数数组</returns>
private static object[] GetParametersFromRequest(HttpRequest request, ParameterInfo[] parameters)
{
if (parameters.IsNullOrEmpty())
{
return null;
}
int length = parameters.Length;
object[] realParameters = new object[length];
for (int i = 0; i < length; i++)
{
ParameterInfo pi = parameters[i];
Type piType = pi.ParameterType.GetRealType();
object value = null;
if (piType.IsValueType())
{
//值类型
value = ModelUtil.GetValue(request, pi.Name, piType);
value = value ?? Activator.CreateInstance(piType);
}
else if (piType.IsClass)
{
//引用类型
object model = ModelUtil.CreateModel(piType);
ModelUtil.FillModelByRequest(request, pi.Name, piType, model);
value = model;
}
else
{
throw new NotSupportedException(pi.Name + " 参数不被支持");
}
realParameters[i] = value;
}
return realParameters;
}
ModelUtil会从Http Request获取参数,并进行类型转换处理:
internal static class ModelUtil
{
/// <summary>
/// 缓存构造函数
/// </summary>
private static Hashtable constructorTable = Hashtable.Synchronized(new Hashtable());
/// <summary>
/// 根据名称从HttpRequest获取值
/// </summary>
/// <param name="request">HttpRequest</param>
/// <param name="name">键名称</param>
/// <param name="type">参数类型</param>
/// <returns></returns>
public static object GetValue(HttpRequest request, string name, Type type)
{
string[] values = null;
if (string.Compare(request.RequestType, "POST", true) == 0)
{
values = request.Form.GetValues(name);
}
else
{
values = request.QueryString.GetValues(name);
}
if (values.IsNullOrEmpty())
{
return null;
}
string data = values.Length == 1 ? values[0] : string.Join(",", values);
return Convert.ChangeType(data, type);
}
/// <summary>
/// 创建实例对象
/// </summary>
/// <param name="type">实例类型</param>
/// <returns></returns>
public static object CreateModel(Type type)
{
if (type == null)
{
throw new ArgumentNullException("type");
}
Func<object> func = constructorTable[type.AssemblyQualifiedName] as Func<object>;
if (func == null)
{
func = ReflectionUtil.GetConstructorDelegate(type);
constructorTable[type.AssemblyQualifiedName] = func;
}
if (func != null)
{
return func();
}
return null;
}
/// <summary>
/// 填充模型
/// </summary>
/// <param name="request">HttpRequest</param>
/// <param name="name">键名称</param>
/// <param name="prefix">参数类型</param>
/// <parparam name="model">实例对象</parparam>
public static void FillModelByRequest(HttpRequest request, string name, Type type, object model)
{
if (model == null)
{
return;
}
IEnumerable<DataMember> members = DataMemberManager.GetDataMember(type);
if (members.IsNullOrEmpty())
{
return;
}
object value = null;
foreach (DataMember member in members)
{
value = GetValue(request, string.Format("{0}.{1}", name, member.Name), member.MemberType);
value = value ?? GetValue(request, member.Name, member.MemberType);
member.SetValue(model, value);
}
}
}









