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保存到指定路径,后一个就是读文件转换成实体了,这个也是泛型方法

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值