/// <summary>创建</summary> /// <param name="type">类型</param> /// <param name="name">名称</param> /// <param name="paramTypes">参数类型</param> /// <returns></returns> public static MethodInfoX Create(Type type, String name, Type[] paramTypes) { //var method = type.GetMethod(name, paramTypes); //if (method == null) method = type.GetMethod(name, DefaultBinding, null, paramTypes, null); //if (method == null) method = type.GetMethod(name, DefaultBinding | BindingFlags.IgnoreCase, null, paramTypes, null); //if (method == null && type.BaseType != typeof(Object)) return Create(type.BaseType, name, paramTypes); var method = TypeX.GetMethod(type, name, paramTypes); if (method == null) { return(null); } return(Create(method)); }
/// <summary>获取方法</summary> /// <remarks>用于具有多个签名的同名方法的场合,不确定是否存在性能问题,不建议普通场合使用</remarks> /// <param name="type">类型</param> /// <param name="name">名称</param> /// <param name="paramTypes">参数类型数组</param> /// <returns></returns> public override MethodInfo GetMethod(Type type, String name, params Type[] paramTypes) { // 参数数组必须为空,或者所有参数类型都不为null,才能精确匹配 if (paramTypes == null || paramTypes.Length == 0 || paramTypes.All(t => t != null)) { var method = base.GetMethod(type, name, paramTypes); if (method != null) { return(method); } } // 任意参数类型为null,换一种匹配方式 if (paramTypes.Any(t => t == null)) { var ms = GetMethods(type, name, paramTypes.Length); if (ms == null || ms.Length == 0) { return(null); } // 对比参数 foreach (var mi in ms) { var ps = mi.GetParameters(); var flag = true; for (int i = 0; i < ps.Length; i++) { if (paramTypes[i] != null && !ps[i].ParameterType.IsAssignableFrom(paramTypes[i])) { flag = false; break; } } if (flag) { return(mi); } } } return(TypeX.GetMethod(type, name, paramTypes)); }