private string ShowDetail() { Custom custom; Bot.PluginBase.Plugin plugin; if (PluginManager.CommandMapStatic.Keys.Contains(CommandName)) { plugin = PluginManager.CommandMapStatic[CommandName]; custom = new Custom { Title = plugin.Name, Helps = plugin.Helps, Author = plugin.Author, Version = plugin.Version, State = plugin.State, Arg = new Dictionary <string, string>(), FreeArg = new Dictionary <string, string>() }; } else if (PluginManager.ApplicationList.Select(k => k.Name).Contains(CommandName)) { plugin = PluginManager.ApplicationList.First(k => k.Name == CommandName); custom = new Custom { Title = plugin.Name, Helps = plugin.Helps, Author = plugin.Author, Version = plugin.Version, State = plugin.State, Arg = new Dictionary <string, string>(), FreeArg = new Dictionary <string, string>() }; } else { return("未找到相关资源..."); } var sbArg = new StringBuilder(); var sbFree = new StringBuilder(); Type t = plugin.GetType(); var props = t.GetProperties(); foreach (var prop in props) { var info = prop.GetCustomAttributes(false); if (info.Length == 0) { continue; } string helpStr = "尚无帮助信息。", argStr = null, freeStr = null, argName = null; bool isSwitch = false; foreach (var o in info) { switch (o) { case ArgAttribute argAttrib: argStr = $"-{argAttrib.Name}"; argName = prop.Name; isSwitch = argAttrib.IsSwitch; break; case FreeArgAttribute _: freeStr = prop.Name; break; case HelpAttribute helpAttrib: helpStr = string.Join(" ", helpAttrib.Helps); break; } } if (argStr != null) { sbArg.Append($" [{argStr}{(isSwitch ? "" : " " + StringConvert.ToUnderLineStyle(argName))}]"); if (!custom.Arg.ContainsKey(argStr)) { custom.Arg.Add(argStr, helpStr); } else { int i = 0; while (custom.Arg.ContainsKey(argStr + " (" + i + ")")) { i++; } custom.Arg.Add(argStr + " (" + i + ")", helpStr); } } if (freeStr != null) { sbFree.Append($" [{StringConvert.ToUnderLineStyle(freeStr)}]"); custom.FreeArg.Add(StringConvert.ToUnderLineStyle(freeStr), helpStr); } } custom.Usage = plugin is ApplicationPlugin ? "自动触发。" : $"/{CommandName}{sbArg}{sbFree}"; return(new FileImage(DrawDetail(custom)).ToString()); }