人如果没有梦想那和咸鱼有什么区别,即使是做咸鱼也要做最咸的那一条

—— Wy

C#之泛型的使用

在写网站的时候,因为各种需要,决定将部分配置用文件保存起来,使用的时候就把它读到内存中,用静态对象存着,所以可能会有各种各样的配置文件,于是我决定写一个泛型类,将各种配置以json的形式保存起来


public class JsonConfig<T> where T : IJsonConfig, new()
    {
        public static T Config { get; private set; }
        /// <summary>
        /// 创建或者修改配置
        /// </summary>
        /// <param name="siteConfig"></param>
        /// <returns></returns>
        public static async Task CreateOrUpdateSiteConfig(T siteConfig)
        {
            await siteConfig.FilePath.SaveJsonAsync(siteConfig);
            Config = siteConfig;
        }


        /// <summary>
        /// 获取配置
        /// </summary>
        /// <returns></returns>
        public static async Task<T> GetSiteConfigAsync()
        {
            if (Config != null)
                return Config;
            T t = new T();
            if (!File.Exists(t.FilePath))
                return t;
            return Config = await t.FilePath.GetJsonEntityAsync<T>();
        }

        /// <summary>
        /// 获取配置
        /// </summary>
        /// <returns></returns>
        public static T GetSiteConfig()
        {
            if (Config != null)
                return Config;
            <span style="color: inherit; font-size: inherit;">T t = new T();</span>
            if (!File.Exists(t.FilePath))
                return t;
            return Config = <span style="color: inherit; font-size: inherit;">t</span><span style="color: inherit; font-size: inherit;">.FilePath.GetJsonEntity<T>();</span><br>        }
    }


这里T就是各种配置的实体类型


/// <summary>
    /// Json配置
    /// </summary>
    public interface IJsonConfig
    {
        string FilePath { get; }
    }


IJsonConfig 接口是为让每一个实体拥有一个自己定义的路径来储存文件


下面是我博客站点配置的实体

    /// 博客站点配置
    /// </summary>
    public class BlogSiteConfig : ICloneable, IJsonConfig
    {
        /// <summary>
        /// 站点配置路径
        /// </summary>
        private static string SiteConfig = $"{Directory.GetParent(Assembly.GetEntryAssembly().Location).FullName}/siteconfig.json";

        /// <summary>
        /// 站点名称
        /// </summary>
        public string SiteName { get; set; }

        /// <summary>
        /// 站点首页标题
        /// </summary>
        public string Title { get; set; }

        /// <summary>
        /// 站点关键词
        /// </summary>
        public string KeyWords { get; set; }

        /// <summary>
        /// 站点简介
        /// </summary>

        public string Desc { get; set; }

        /// <summary>
        /// 座右铭
        /// </summary>
        public string Motto { get; set; }

        /// <summary>
        /// 座右铭-昵称
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// Head的HTML代码
        /// </summary>
        public string HeadHtml { get; set; }

        /// <summary>
        /// 全局JS代码
        /// </summary>

        public string StaticJavaScrpit { get; set; }

        /// <summary>
        /// 备案号
        /// </summary>
        public string RecordNumber { get; set; }

        /// <summary>
        /// 微信公众号图片链接
        /// </summary>
        public string WeChat { get; set; }

        /// <summary>
        /// 右侧广告代码
        /// </summary>
        public string RightAdvertisement { get; set; }

        public string FilePath => SiteConfig;

        public object Clone()
        {
            return this.MemberwiseClone();
        }
    }


这里定义了一个静态对象SiteConfig,它就是这个实体的路径(接口里面是不能有静态,抽象类里面也静态不能重写之类的),把实例属性FilePath指向这个静态变量,免得让每一个实体都去拼接和生成路径


上面的SaveJsonAsyncGetJsonEntityAsync皆为String的拓展方法,从名称就可以看出来,前一个是已异步的方式将对象转为JSON保存到指定路径,后一个就是读文件转换成实体了,这个也是泛型方法









评论

用户默认头像
发表我的评论
取消评论
看不清,点击刷新验证码