Example #1
0
        /// <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));
        }
Example #2
0
        /// <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));
        }