箭头_Row 发表于 2024-8-6 16:01:36

關於用戶交互時選擇關鍵字的簡化寫法

本帖最后由 箭头_Row 于 2024-8-7 05:51 编辑

功能介紹:用戶交互時選擇關鍵字的簡化寫法

用戶交互時提示用戶選擇關鍵字:
一、獲取關鍵字字典;
二、添加關鍵字;
三、比對關鍵字輸入;

測試代碼部份:

namespace ArrowTools;
public class Enum_Test
{
    private enum Keywords
    {
      
      板厚 = 1,
      
      字典 = 2,
      
      图层 = 4,
      
      填充 = 8
    }
   
    public static void EnumKeywordsTest()
    {
      PromptKeywordOptions options = new(string.Empty);
      var keywordsMap = GetKeywordsMap<Keywords>();
      options.AddKeywords([.. keywordsMap.Keys]);
      options.AppendKeywordsToMessage = false;//不将关键字列表添加到提示信息中
      options.Message = $"图层状态:" + keywordsMap.ToMessage();

      PromptResult pr = Env.Editor.GetKeywords(options);
      if (pr.Status != PromptStatus.OK)
      {
            Env.Printl("命令取消!");
            return;
      }

      switch (keywordsMap.enumValue)
      {
            case Keywords.板厚:
                Env.Printl("触发了关键字:板厚......");
                break;
            case Keywords.字典:
                Env.Printl("触发了关键字:字典......");
                break;
            case Keywords.图层:
                Env.Printl("触发了关键字:图层......");
                break;
            case Keywords.填充:
                Env.Printl("触发了关键字:填充......");
                break;
      }

      // switch .NET8.0 的最新寫法
      var str = keywordsMap.enumValue switch
      {
            Keywords.板厚 => Keywords.板厚.ToString(),
            Keywords.字典 => Keywords.字典.ToString(),
            Keywords.图层 => Keywords.图层.ToString(),
            Keywords.填充 => Keywords.填充.ToString(),
            _ => throw new NotImplementedException(),
      };
      Env.Printl("第二次打印触发了关键字:" + str);

    }
}

GetKeywordsMap( );

/// <summary>
/// 獲取關鍵字字典
/// </summary>
/// <typeparam name="T">關鍵字枚舉</typeparam>
/// <returns> Dictionary 快捷鍵,(描述字_中文,Enum值)</returns>
public static Dictionary<string, (string Key_CN, T enumValue)> GetKeywordsMap<T>() where T : Enum
{
   Dictionary<string, (string, T)> keywordsDic = [];
   var type = typeof(T);
   var typeDesc = typeof(DescriptionAttribute);
   foreach (var e in Enum.GetValues(type))
   {
         var name = e.ToString();
         object objArr = type.GetField(name).GetCustomAttributes(typeDesc, true);
         keywordsDic.Add(((DescriptionAttribute)objArr).Description, (name, (T)e));
   }
   return keywordsDic;
}

AddKeywords( );
/// <summary>
/// 添加关键字至设置中
/// </summary>
/// <param name="options">jig设置</param>
/// <param name="keywords">关键字</param>
public static void AddKeywords(this PromptKeywordOptions? options, IEnumerable<string> keywords)
{
   foreach (var key in keywords)
   {
         if (!options!.Keywords.Contains(key))
             options.Keywords.Add(key);
   }
}
備註:其它類型的PromptKeywordOptions 可參照此函數封裝!!!!

ToMessage( );
/// <summary>
/// 获取关键字提示信息行。
/// </summary>
/// <param name="keywordsDic">keywords關鍵字字典</typeparam>
/// <param name="defaultKeyword">可选的默认关键字,非空时添加到结果中</param>
/// <returns> 返回格式示例:[字典(D)/板厚(T)/层高(H)/完成面(F)/图层(C)]</returns>
public static StringBuilder ToMessage<T>(this Dictionary<string, (string Key_CN, T enumValue)> keywordsDic, string defaultKeyword = "") where T : Enum
{
   int number = 0;
   StringBuilder keywordNotice = new("[");
   foreach (var item in keywordsDic)
   {
         keywordNotice.Append(item.Value.Key_CN);
         keywordNotice.Append('(');
         keywordNotice.Append(item.Key);
         keywordNotice.Append(')');
         if (number < keywordsDic.Count - 1)
             keywordNotice.Append('/');
         number++;
   }
   keywordNotice.Append(']');

   if (defaultKeyword != string.Empty)
         if (keywordsDic.ContainsKey(defaultKeyword))
             keywordNotice.Append($"<{defaultKeyword}>");
         else    // 無默認值時報錯提示
             throw new ArgumentException("错误的默认值!");

   return keywordNotice;
}

備註: 感謝驚驚大佬的關於如何使用map的指教!!!!


页: [1]
查看完整版本: 關於用戶交互時選擇關鍵字的簡化寫法