欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# 開發(fā)日志本地化工具

 更新時(shí)間:2021年02月07日 09:52:25   作者:zhouandke  
這篇文章主要介紹了C# 開發(fā)日志本地化工具的步驟,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下

    程序員討厭寫文檔, 討厭寫注釋, 而我還討厭寫日志, 輸出一個(gè)  "Id=5, 姓名=王大錘, 性別=男, 生日=2020年1月1日"  總歸會(huì)用到字符串的填充

var log = $"Id={person.Id}, 姓名={person.Name}, 性別={(person.Sex == SexType.Man ? "男性" : "女性")}, 生日={person.Birthday}";

    Json序列化工具多好啊, 可是輸出的是

 {"id": 5,"name":"葫蘆娃", "sex":"Man", "birthday":"2020-1-1 00:00:00"}

    業(yè)務(wù)部門的人就是看不懂, 畢竟不是人人都有良好的英語(yǔ)基礎(chǔ), 同時(shí)我也經(jīng)常猜不到有人用  DRLS 表示 "當(dāng)日流水".

    其實(shí)如果只要稍微把 json 里面的key 用中文替代, 業(yè)務(wù)部門還是能大概讀得懂大部分意思的.

    所以我開發(fā)了一個(gè)工具  LocalizationTools, 協(xié)助生成中文日志.

    新建一個(gè) Console, 引入 nuget 包: LocalizationTools, 然后定義示例類

/// <summary>
  /// 人類
  /// </summary>
  public class Person
  {
    /// <summary>
    /// Id
    /// </summary>
    public int Id { get; set; }

    /// <summary>
    /// 名字
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// 出生日期, 出生日期最好不要超過當(dāng)前時(shí)間
    /// </summary>
    [DisplayName("出生日期")]
    public DateTime Birthday { get; set; }

    /// <summary>
    /// 性別
    /// </summary>
    public SexType Sex { get; set; }

    /// <summary>
    /// 是否活著
    /// </summary>
    public bool IsAlive { get; set; }
  }

  /// <summary>
  /// 性別
  /// </summary>
  public enum SexType
  {
    /// <summary>
    /// 男性
    /// </summary>
    Man = 0,
    /// <summary>
    /// 女性
    /// </summary>
    Woman = 2,
    /// <summary>
    /// 人妖
    /// </summary>
    Ladyman = 3,
  }

   記得在生成界面勾上 XML文檔文件

      使用代碼

static void Main(string[] args)
    {
      var p1 = new Person
      {
        Id = 1,
        Name = "王大錘",
        Birthday = DateTime.Parse("2020-01-01"),
        Sex = SexType.Man,
      };
      LocalizationTools.KeyValueSeparator = "=";
      var str = LocalizationTools.ToString(p1);
      Console.WriteLine(str);
    }

    相信這樣的輸出, 大部分人也應(yīng)該能夠看懂了

{"Id"=1,"名字"="王大錘","出生日期"="2020/1/1 0:00:00","性別"="男性","是否活著"=false}

    LocalizationTools.ToString() 方法會(huì)將 屬性名稱 替換成注釋里的 Summary 信息, 枚舉值也同樣會(huì)進(jìn)行這樣的替換

    如果字段很少, 剛才的輸出還沒什么問題, 如果字段非常多, 讀著就眼花繚亂了, 所以我建議還是這行刪除    

LocalizationTools.KeyValueSeparator = "=";

    這樣輸出的內(nèi)容是 

{"Id":1,"名字":"王大錘","出生日期":"2020/1/1 0:00:00","性別":"男性","是否活著":false}

    使用Json工具格式化一下

{
  "Id": 1, 
  "名字": "王大錘", 
  "出生日期": "2020/1/1 0:00:00", 
  "性別": "男性", 
  "是否活著": false
}

    這樣即使包含了子對(duì)象的對(duì)象, 也非常清晰明了了.

    這里面的不足是:  "是否活著" 這個(gè)屬性輸出的是 true/false, 布爾值在不同的場(chǎng)景可以表示:  是/否、對(duì)/錯(cuò)、啟用/關(guān)閉....... 業(yè)務(wù)人員可不想自己猜, 解決辦法有兩個(gè)

    1. 在ToString()前, 我知道IsAlive是false, 應(yīng)該用 "否" 來替換

var str = LocalizationTools.ToString(p1, new { IsAlive = "否" });
// 輸出 {"Id":1,"名字":"王大錘","出生日期":"2020/1/1 0:00:00","性別":"男性","是否活著":"否"}

    2. 給 IsAlive 屬性加上 ToStringReplacePairAttribute, 來替換某些特定的值

[ToStringReplacePair(true, "是", false, "否")]
public bool IsAlive { get; set; }

     LocalizationTools 替換 屬性名稱 的順序是 1. DisplayNameAttribute   2. 注釋里的summary, 因?yàn)橛行┤讼矚g在 summary 中加入其他說明信息, 輸出到日志里不好看;

     由于 DisplayNameAttribute 不能作用于 enum枚舉值, 所以我專門定義了 EnumAliasAttribute, 它的優(yōu)先級(jí)也比 注釋里的summary 高

     這里特別強(qiáng)調(diào)一下,  LocalizationTools.ToString() 不是一個(gè)Json 序列化工具, 為了使用隨處可見的 Json格式化工具, 而將輸出調(diào)整得像Json, 所以這個(gè)工具從來就沒有考慮到反序列化功能, 也沒有去解決循環(huán)引用的問題, 也沒有考慮到要符合Json 的標(biāo)準(zhǔn), 僅僅是一個(gè)方便輸出中文日志的工具, 也沒有追求高性能.

     LocalizationTools.ToString() 特別適用于面向數(shù)據(jù)表的編程, 因?yàn)楸碜侄我话愣际呛?jiǎn)單的類型, 輸出的日志更為直觀.

     按理說應(yīng)該為這個(gè)工具提供擴(kuò)展方法, 但是我有強(qiáng)迫癥, 許多類庫(kù)給 object 加上了各種擴(kuò)展方法, 讓我很不爽, 所以我沒有在類庫(kù)中主動(dòng)加入擴(kuò)展方法, 大家可以在自己的項(xiàng)目里加入以下代碼, 以提供擴(kuò)展方法

namespace Localization
{
  using System.Collections.Generic;
  public static class LocalizationToolsExtend
  {
    public static string ToLocalizationString(this object obj, params string[] ignorePropertyNames)
    {
      return LocalizationTools.ToString(obj, ignorePropertyNames);
    }

    public static string ToLocalizationString<T>(this object obj, T customPropertyValues, params string[] ignorePropertyNames)
       where T : class
    {
      return LocalizationTools.ToString(obj, customPropertyValues, ignorePropertyNames);
    }

    public static string ToLocalizationString(this object obj, Dictionary<string, object> customPropertyValues, params string[] ignorePropertyNames)
    {
      return LocalizationTools.ToString(obj, customPropertyValues, ignorePropertyNames);
    }

    public static string ToLocalizationStringInclude(this object obj, IEnumerable<string> includePropertyNames)
    {
      return LocalizationTools.ToStringInclude(obj, includePropertyNames);
    }

    public static string ToLocalizationStringInclude<T>(this object obj, IEnumerable<string> includePropertyNames, T customPropertyValues)
      where T : class
    {
      return LocalizationTools.ToStringInclude(obj, includePropertyNames, customPropertyValues);
    }

    public static string ToLocalizationStringInclude(this object obj, IEnumerable<string> includePropertyNames, Dictionary<string, object> customPropertyValues)
    {
      return LocalizationTools.ToStringInclude(obj, includePropertyNames, customPropertyValues);
    }
  }
}

     新增實(shí)體的日志解決了, 接下來又有另一個(gè)問題, 如何保存實(shí)體變化的日志?

     最簡(jiǎn)單的辦法就是把 實(shí)體類 修改前的json 和 修改后的json 都保存起來, 讓業(yè)務(wù)人員自己去痛苦尋找的變化, 呵呵呵, 只要是個(gè)人, 都會(huì)抱怨.

     讓程序員一個(gè)字段一個(gè)字段的比較, 然后生成日志, 開玩笑! 我干不來這樣枯燥的活

     nuget 上有 JsonDiffPatch 這樣的工具生成 JSON patch, 但輸出的結(jié)果就不是為人類準(zhǔn)備的, 所以我又繼續(xù)寫了 Compare 方法

static void Main(string[] args)
{
  var p1 = new Person
  {
    Id = 1,
    Name = "王大錘",
    Birthday = DateTime.Parse("2020-01-01"),
    Sex = SexType.Man,
  };
  var p2 = new Person
  {
    Id = 1,
    Name = "王小錘",
    Birthday = DateTime.Parse("2021-01-01"),
    Sex = SexType.Man,
  };
  var compareResult = LocalizationTools.Compare(p1, p2);
  Console.WriteLine(compareResult.GetDifferenceMsg());
}
// 輸出: {"名字":{"從":"王大錘","變成":"王小錘"},"出生日期":{"從":"2020/1/1 0:00:00","變成":"2021/1/1 0:00:00"}}

     Json格式化一下

{
  "名字": {
    "從": "王大錘",
    "變成": "王小錘"
  },
  "出生日期": {
    "從": "2020/1/1 0:00:00",
    "變成": "2021/1/1 0:00:00"
  }
}

     當(dāng)然你可以對(duì) CompareResult 進(jìn)行進(jìn)一步處理, 使用 UpdateDifferentProperty 修改里面的比較結(jié)果, 最后再得出比較結(jié)果.

以上就是C# 開發(fā)日志本地化工具的詳細(xì)內(nèi)容,更多關(guān)于C# 日志本地化工具的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#讀取xml節(jié)點(diǎn)數(shù)據(jù)方法小結(jié)

    C#讀取xml節(jié)點(diǎn)數(shù)據(jù)方法小結(jié)

    這篇文章主要介紹了C#讀取xml節(jié)點(diǎn)數(shù)據(jù)的方法,實(shí)例總結(jié)了C#針對(duì)XML文件節(jié)點(diǎn)操作的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • C#和SQL實(shí)現(xiàn)的字符串相似度計(jì)算代碼分享

    C#和SQL實(shí)現(xiàn)的字符串相似度計(jì)算代碼分享

    這篇文章主要介紹了C#和SQL實(shí)現(xiàn)的字符串相似度計(jì)算代碼分享,本文分別給出了C#語(yǔ)言和SQL語(yǔ)言的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-10-10
  • C#為控件添加自定義事件及自定義觸發(fā)

    C#為控件添加自定義事件及自定義觸發(fā)

    C#本身提供了很強(qiáng)大的控件庫(kù),但是很多控件庫(kù)的功能只是一些基本的功能,本文主要介紹了C#為控件添加自定義事件及自定義觸發(fā),具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-04-04
  • 解析C#面向?qū)ο缶幊讨蟹椒ǎ╩ethod)的使用

    解析C#面向?qū)ο缶幊讨蟹椒ǎ╩ethod)的使用

    這篇文章主要介紹了解析C#面向?qū)ο缶幊讨蟹椒ǎ╩ethod)的使用,方法是面向?qū)ο缶幊陶Z(yǔ)言中的基本特性,需要的朋友可以參考下
    2016-01-01
  • C# 設(shè)置系統(tǒng)日期格式的方法

    C# 設(shè)置系統(tǒng)日期格式的方法

    公司電腦各式各樣的都有,里面的設(shè)置也有很多不統(tǒng)一的,我們做軟件一般會(huì)從系統(tǒng)中獲取一些數(shù)據(jù),比如日期時(shí)間,環(huán)境變量的路徑參數(shù),可以用批處理文件達(dá)到我們所想要的目的,也可以用C#代碼
    2013-03-03
  • C#實(shí)現(xiàn)俄羅斯方塊基本功能

    C#實(shí)現(xiàn)俄羅斯方塊基本功能

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)俄羅斯方塊的基本功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C#過濾sql特殊字符串的方法

    C#過濾sql特殊字符串的方法

    這篇文章介紹了C#過濾sql特殊字符串的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • C#實(shí)現(xiàn)XML文件讀取

    C#實(shí)現(xiàn)XML文件讀取

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)XML文件讀取的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • winform樹形菜單無限級(jí)分類實(shí)例

    winform樹形菜單無限級(jí)分類實(shí)例

    本文介紹了“winform樹形菜單無限級(jí)分類實(shí)例”,需要的朋友可以參考一下
    2013-03-03
  • C#怎么給PDF添加背景圖片

    C#怎么給PDF添加背景圖片

    無論是辦公還是日常生活中都經(jīng)常會(huì)用到,很多時(shí)候,PDF文件的背景色都是白色,看多了難免覺得累,更換PDF的背景不僅可以讓眼睛看起來更舒服,還可以讓PDF文件看上去更美觀。這篇文章我主要寫的是如何使用C# 給PDF文件添加圖片背景
    2016-02-02

最新評(píng)論