//public static void _MJ_(this Form form, string controller, string method, params object[] values)
        //{
        //    var asm = Assembly.GetCallingAssembly();

        //    var clsname = string.IsNullOrEmpty(controller) ? "MAINCONTROLLER" : controller.ToUpper();

        //    var types = from t in asm.GetTypes()
        //                where t.IsClass &&
        //                t.IsPublic &&
        //                t.Name.ToUpper().Equals(clsname)
        //                select t;

        //    if (types.Count() > 0)
        //    {
        //        object classInstance = Activator.CreateInstance(types.ElementAt(0), null);

        //        List<Type> paraTypes = new List<Type>();

        //        foreach(var p in values)
        //        {
        //            paraTypes.Add(p.GetType());
        //        }
        //        var methodInstance = types.ElementAt(0).GetMethod(method, paraTypes.ToArray());

        //        if (methodInstance != null && methodInstance.ReturnType == typeof(object[]))
        //        {
        //            object[] retvalues = (object[])methodInstance.Invoke(classInstance, values);

        //            if (retvalues == null)
        //                return;

        //            foreach(var o in retvalues)
        //            {
        //                var genericMethod = typeof(_MJ_Helper).GetMethod("Load")
        //                                        .MakeGenericMethod(new Type[] { o.GetType() });

        //                genericMethod.Invoke(null, new object[] { form, o });
        //            }
        //        }
        //        else
        //            throw new Exception(string.Format("[MJ] cannot find proper Method [{0}] from [{1}]", method, clsname));


        //    }
        //    else
        //        throw new Exception(string.Format("[MJ] cannot find controller [{0}]",clsname));

        //}

        private static bool CollectMethods(Assembly asm)
        {
            list.Clear();

            var classtypes = from t in asm.GetTypes()
                             where t.IsClass &&
                             t.IsPublic &&
                             t.Name.ToUpper().Contains("CONTROLLER")
                             select t;

            if (classtypes == null)
            {
                return(false);
            }

            foreach (var cls in classtypes)
            {
                var mtdInfos = cls.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);

                if (mtdInfos == null)
                {
                    continue;
                }
                foreach (var m in mtdInfos)
                {
                    if (m.ReturnType != typeof(object[]))
                    {
                        continue;
                    }

                    var ps = m.GetParameters();

                    List <Type> paraTypes = new List <Type>();

                    var count = ps != null?ps.Count() : 0;

                    if (count > 0)
                    {
                        foreach (var p in ps)
                        {
                            paraTypes.Add(p.ParameterType);
                        }
                    }
                    else
                    {
                        paraTypes = null;
                    }

                    var mtd = new _MJ_Method(m.Name,
                                             cls.Name,
                                             count,
                                             paraTypes,
                                             m
                                             );
                    list.Add(mtd);
                }
            }
            if (list.Count() > 0)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
        public static void _MJ_(this Form form, string controller, string method, params object[] values)
        {
            var asm = Assembly.GetCallingAssembly();

            if (list.Count() == 0)
            {
                if (!CollectMethods(asm))
                {
                    throw new Exception(string.Format(
                                            "[MJ] cannot find controllers or their methods in {0},so cann't use MJ MVC", asm.FullName));
                }
            }

            List <Type> paraTypes = new List <Type>();

            var count = values != null?values.Count() : 0;

            if (count > 0)
            {
                foreach (var p in values)
                {
                    paraTypes.Add(p.GetType());
                }
            }
            else
            {
                paraTypes = null;
            }

            var mtds = from m in list
                       where m.Name == method &&
                       m.ParamsCount == count &&
                       m.ParamsType.SequenceEqual(paraTypes)
                       select m;

            if (mtds == null || mtds.Count() == 0)
            {
                throw new Exception(string.Format("[MJ] cannot find proper Method [{0}] from [{1}]", method, asm.FullName));
            }

            var tecount = mtds.Count();

            _MJ_Method invoker = null;

            if (mtds.Count() == 1)
            {
                invoker = mtds.ElementAt(0);
            }
            else
            {
                var exect = from m in mtds
                            where m.ClassName.ToUpper().Equals(controller.ToUpper())
                            select m;
                if (exect != null && exect.Count() > 0)
                {
                    invoker = exect.ElementAt(0);
                }
                else
                {
                    var like = from m in mtds
                               where m.ClassName.ToUpper().Contains(controller.ToUpper())
                               select m;

                    if (like != null && like.Count() > 0)
                    {
                        invoker = like.ElementAt(0);
                    }
                    else
                    {
                        throw new Exception(string.Format("[MJ] cannot find proper Method [{0}] from [{1}]", method, asm.FullName));
                    }
                }
            }

            object classInstance = Activator.CreateInstance(invoker.Method.DeclaringType, null);

            List <Type> valuesTypes = new List <Type>();

            foreach (var p in values)
            {
                valuesTypes.Add(p.GetType());
            }

            object[] retvalues = (object[])invoker.Method.Invoke(classInstance, values);

            if (retvalues == null)
            {
                return;
            }

            foreach (var o in retvalues)
            {
                var genericMethod = typeof(_MJ_Helper).GetMethod("Load")
                                    .MakeGenericMethod(new Type[] { o.GetType() });

                genericMethod.Invoke(null, new object[] { form, o });
            }
        }