自己动手写ORM框架(六):实现查询功能FindById方法(六)

2014-11-24 11:47:20 · 作者: · 浏览: 69
}
// 创建Set委托
internal static SetHandler CreateSetHandler(Type type, PropertyInfo propertyInfo)
{
MethodInfo setMethodInfo = propertyInfo.GetSetMethod(true);
DynamicMethod dynamicSet = CreateSetDynamicMethod(type);
ILGenerator setGenerator = dynamicSet.GetILGenerator();
setGenerator.Emit(OpCodes.Ldarg_0);
setGenerator.Emit(OpCodes.Ldarg_1);
UnboxIfNeeded(setMethodInfo.GetParameters()[0].ParameterType, setGenerator);
setGenerator.Emit(OpCodes.Call, setMethodInfo);
setGenerator.Emit(OpCodes.Ret);
return (SetHandler)dynamicSet.CreateDelegate(typeof(SetHandler));
}
// 创建Set委托
internal static SetHandler CreateSetHandler(Type type, FieldInfo fieldInfo)
{
DynamicMethod dynamicSet = CreateSetDynamicMethod(type);
ILGenerator setGenerator = dynamicSet.GetILGenerator();
setGenerator.Emit(OpCodes.Ldarg_0);
setGenerator.Emit(OpCodes.Ldarg_1);
UnboxIfNeeded(fieldInfo.FieldType, setGenerator);
setGenerator.Emit(OpCodes.Stfld, fieldInfo);
setGenerator.Emit(OpCodes.Ret);
return (SetHandler)dynamicSet.CreateDelegate(typeof(SetHandler));
}
// 创建Get动态方法
private static DynamicMethod CreateGetDynamicMethod(Type type)
{
return new DynamicMethod("DynamicGet", typeof(object),
new Type[] { typeof(object) }, type, true);
}
// 创建Set动态方法
private static DynamicMethod CreateSetDynamicMethod(Type type)
{
return new DynamicMethod("DynamicSet", typeof(void),
new Type[] { typeof(object), typeof(object) }, type, true);
}
// BoxIfNeeded
private static void BoxIfNeeded(Type type, ILGenerator generator)
{
if (type.IsValueType)
{
generator.Emit(OpCodes.Box, type);
}
}
// UnboxIfNeeded
private static void UnboxIfNeeded(Type type, ILGenerator generator)
{
if (type.IsValueType)
{
generator.Emit(OpCodes.Unbox_Any, type);
}
}
}
}
TypeUtils代码:
using System;
using System.Collections.Generic;
using System.Text;
namespace System.Orm.Common
{
public class TypeUtils
{
public static object ConvertForType(object value,Type type)
{
switch (type.FullName)
{
case "System.String":
value = value.ToString();
break;
case "System.Boolean":
value = bool.Parse(value.ToString());
break;
case "System.Int16":
case "System.Int32":
case "System.Int64":
value = int.Parse(value.ToString());
break;
case "System.Double":
value = double.Parse(value.ToString());
break;
case "System.Decimal":
value = new decimal(double.Parse(value.ToString()));
break;
}
return value;
}
}
}
好了,Fin