/// <summary> /// 得到过程委托 /// </summary> /// <param name="method">方法对象</param> /// <returns>返回过程委托</returns> public static Proc GetProc(this System.Reflection.MethodInfo method) { Guard.NotNull(method, "method"); var proc = method.DeclaringType.IsValueType ? (target, args) => method.Invoke(target, args) : DefaultDynamicMethodFactory.CreateProcMethod(method); return((target, args) => { if (args == null) { args = new object[method.GetParameters().Length]; } try { proc(target, args); } catch (TargetInvocationException ex) { throw ex.InnerException; } catch (Exception ex) { throw ex; } }); }
/// <summary> /// 得到构造函数委托 /// </summary> /// <param name="constructor">构造函数</param> /// <returns>返回构造函数委托</returns> public static ConstructorHandler GetCreator(this System.Reflection.ConstructorInfo constructor) { Guard.NotNull(constructor, "constructor"); ConstructorHandler ctor = constructor.DeclaringType.IsValueType ? (args) => constructor.Invoke(args) : DefaultDynamicMethodFactory.CreateConstructorMethod(constructor); ConstructorHandler handler = args => { if (args == null) { args = new object[constructor.GetParameters().Length]; } try { return(ctor(args)); } catch (TargetInvocationException ex) { throw ex.InnerException; } catch (Exception ex) { throw ex; } }; return(handler); }
/// <summary> /// 得到设置器委托 /// </summary> /// <param name="member">成员</param> /// <returns>返回设置器委托</returns> public static Setter GetSetter(this System.Reflection.MemberInfo member) { Guard.NotNull(member, "member"); Setter setter = null; if (member.DeclaringType.IsValueType) { switch (member.MemberType) { case MemberTypes.Field: setter = (target, value) => (member as FieldInfo).SetValue(target, value); break; case MemberTypes.Property: setter = (target, value) => (member as PropertyInfo).SetValue(target, value, null); break; case MemberTypes.Method: setter = (target, value) => (member as MethodInfo).Invoke(target, new object[] { value }); break; } } else { setter = DefaultDynamicMethodFactory.CreateSetter(member); } return((target, value) => { try { if (setter != null) { setter(target, value); } } catch (TargetInvocationException ex) { throw ex.InnerException; } catch (Exception ex) { throw ex; } }); }
/// <summary> /// 得到缺省构造函数委托 /// </summary> /// <param name="type"></param> /// <returns></returns> public static DefaultConstructorHandler GetDefaultCreator(this Type type) { Guard.NotNull(type, "type"); var ctor = DefaultDynamicMethodFactory.CreateDefaultConstructorMethod(type); DefaultConstructorHandler handler = () => { try { return(ctor()); } catch (TargetInvocationException ex) { throw ex.InnerException; } catch (Exception ex) { throw ex; } }; return(handler); }