public static MethodDescriptorCollection CreateStaticMethodDescriptors(ICustomAttributeProvider provider)
        {
            var descriptors = new MethodDescriptorCollection();
            var attrs = provider.GetCustomAttributes(typeof(CommandStaticMethodAttribute), true);

            foreach (var item in attrs)
            {
                if (item is CommandStaticMethodAttribute == false)
                    continue;
                var attr = item as CommandStaticMethodAttribute;

                var staticDescriptors = CommandDescriptor.GetMethodDescriptors(attr.StaticType);
                descriptors.AddRange(Filter(staticDescriptors, attr.MethodNames));
            }

            return descriptors;
        }
        public static MethodDescriptorCollection CreateMethodDescriptors(Type type)
        {
            var descriptors = new MethodDescriptorCollection();

            foreach (var item in type.GetMethods())
            {
                var attr = item.GetCustomAttribute<CommandMethodAttribute>();
                if (attr == null)
                    continue;
                descriptors.Add(new MethodDescriptor(item));
            }

            foreach (var item in GetStaticMethodDescriptors(type))
            {
                descriptors.Add(item);
            }

            return descriptors;
        }
 private static IEnumerable<MethodDescriptor> Filter(MethodDescriptorCollection descriptors, params string[] methodNames)
 {
     if (methodNames.Any() == false)
     {
         foreach (var item in descriptors)
         {
             yield return item;
         }
     }
     else
     {
         foreach (var item in methodNames)
         {
             yield return descriptors[item];
         }
     }
 }