首页 > 其他分享 >使用反射管理参数配置

使用反射管理参数配置

时间:2023-08-07 09:46:47浏览次数:54  
标签:反射 string AppConfig 配置 参数 AppConfigManager property config public

在C#中,反射是一种强大的机制,它允许我们在运行时检查和操作类型的成员,包括属性和字段。利用反射,我们可以实现参数的灵活配置和管理。本篇博客将详细介绍如何使用反射来管理参数配置,并提供一个帮助类的代码示例。

创建参数配置类

首先,我们需要创建一个参数配置类,该类将包含我们希望配置的属性。以一个简单的应用为例,我们创建一个名为AppConfig的类,该类具有以下属性:

public class AppConfig
{
    public string ServerAddress { get; set; }
    public int Port { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
}

在这个示例中,我们希望配置服务器地址、端口号、用户名和密码。

使用反射读取和设置参数配置

接下来,我们将展示如何使用反射来读取和设置参数配置。我们需要定义一个帮助类,该类将提供读取和设置参数值的方法。

public static class AppConfigManager
{
    // 使用反射设置参数值
    public static void SetConfigValue<T>(object obj, string propertyName, T value)
    {
        PropertyInfo property = obj.GetType().GetProperty(propertyName);
        if (property != null && property.CanWrite)
        {
            property.SetValue(obj, value);
        }
    }

    // 使用反射获取参数值
    public static T GetConfigValue<T>(object obj, string propertyName)
    {
        PropertyInfo property = obj.GetType().GetProperty(propertyName);
        if (property != null && property.CanRead)
        {
            return (T)property.GetValue(obj);
        }
        return default(T);
    }
}

在上述代码中,我们定义了一个AppConfigManager类,它包含了SetConfigValueGetConfigValue方法。这些方法使用反射来设置和获取参数值。

使用示例

现在,我们可以使用AppConfigManager类来读取和设置参数配置。以下是一个简单的示例:

public class Program
{
    public static void Main(string[] args)
    {
        // 创建参数配置对象
        AppConfig config = new AppConfig();

        // 动态设置参数
        AppConfigManager.SetConfigValue(config, "ServerAddress", "127.0.0.1");
        AppConfigManager.SetConfigValue(config, "Port", 8080);
        AppConfigManager.SetConfigValue(config, "Username", "admin");
        AppConfigManager.SetConfigValue(config, "Password", "password");

        // 动态获取参数
        string serverAddress = AppConfigManager.GetConfigValue<string>(config, "ServerAddress");
        int port = AppConfigManager.GetConfigValue<int>(config, "Port");
        string username = AppConfigManager.GetConfigValue<string>(config, "Username");
        string password = AppConfigManager.GetConfigValue<string>(config, "Password");

        // 输出参数值
        Console.WriteLine("Server Address: " + serverAddress);
        Console.WriteLine("Port: " + port);
        Console.WriteLine("Username: " + username);
        Console.WriteLine("Password: " + password);
    }
}

在上述示例中,我们创建了一个AppConfig对象,并使用AppConfigManager类来设置参数值。然后,我们再次使用AppConfigManager类来获取参数值,并将其输出到控制台。

结论

使用反射可以方便地管理参数配置,使得参数的读取和设置变得灵活和可扩展。我们通过使用AppConfigManager类来演示了如何利用反射来读取和设置参数值。希望本篇博客能够帮助你更好地理解和应用反射机制。

参考资料

完整代码

using System;
using System.Reflection;

public class AppConfig
{
    public string ServerAddress { get; set; }
    public int Port { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
}

public static class AppConfigManager
{
    public static void SetConfigValue<T>(object obj, string propertyName, T value)
    {
        PropertyInfo property = obj.GetType().GetProperty(propertyName);
        if (property != null && property.CanWrite)
        {
            property.SetValue(obj, value);
        }
    }

    public static T GetConfigValue<T>(object obj, string propertyName)
    {
        PropertyInfo property = obj.GetType().GetProperty(propertyName);
        if (property != null && property.CanRead)
        {
            return (T)property.GetValue(obj);
        }
        return default(T);
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        AppConfig config = new AppConfig();

        AppConfigManager.SetConfigValue(config, "ServerAddress", "127.0.0.1");
        AppConfigManager.SetConfigValue(config, "Port", 8080);
        AppConfigManager.SetConfigValue(config, "Username", "admin");
        AppConfigManager.SetConfigValue(config, "Password", "password");

        string serverAddress = AppConfigManager.GetConfigValue<string>(config, "ServerAddress");
        int port = AppConfigManager.GetConfigValue<int>(config, "Port");
        string username = AppConfigManager.GetConfigValue<string>(config, "Username");
        string password = AppConfigManager.GetConfigValue<string>(config, "Password");

        Console.WriteLine("Server Address: " + serverAddress);
        Console.WriteLine("Port: " + port);
        Console.WriteLine("Username: " + username);
        Console.WriteLine("Password: " + password);
    }
}

当需要将配置参数存储到配置文件中时,我们可以使用.NET中提供的配置文件功能来实现。在这种情况下,我们需要对代码进行一些修改和扩展。

首先,我们需要引入System.Configuration命名空间,以便使用配置文件相关的类和接口。然后,我们可以将原先的AppConfig类修改为继承自ConfigurationSection类,同时将其属性标记为ConfigurationProperty

以下是修改后的代码示例:

using System;
using System.Configuration;
using System.Reflection;

public class AppConfig : ConfigurationSection
{
    [ConfigurationProperty("ServerAddress", DefaultValue = "127.0.0.1", IsRequired = true)]
    public string ServerAddress
    {
        get { return (string)this["ServerAddress"]; }
        set { this["ServerAddress"] = value; }
    }

    [ConfigurationProperty("Port", DefaultValue = 8080, IsRequired = true)]
    public int Port
    {
        get { return (int)this["Port"]; }
        set { this["Port"] = value; }
    }

    [ConfigurationProperty("Username", DefaultValue = "admin", IsRequired = true)]
    public string Username
    {
        get { return (string)this["Username"]; }
        set { this["Username"] = value; }
    }

    [ConfigurationProperty("Password", DefaultValue = "password", IsRequired = true)]
    public string Password
    {
        get { return (string)this["Password"]; }
        set { this["Password"] = value; }
    }
}

public static class AppConfigManager
{
    public static void SetConfigValue<T>(object obj, string propertyName, T value)
    {
        PropertyInfo property = obj.GetType().GetProperty(propertyName);
        if (property != null && property.CanWrite)
        {
            property.SetValue(obj, value);
        }
    }

    public static T GetConfigValue<T>(object obj, string propertyName)
    {
        PropertyInfo property = obj.GetType().GetProperty(propertyName);
        if (property != null && property.CanRead)
        {
            return (T)property.GetValue(obj);
        }
        return default(T);
    }

    public static void SaveConfig(AppConfig config)
    {
        Configuration configManager = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        configManager.Sections.Remove("AppConfig");
        configManager.Sections.Add("AppConfig", config);
        configManager.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection("AppConfig");
    }

    public static AppConfig LoadConfig()
    {
        Configuration configManager = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        return (AppConfig)configManager.GetSection("AppConfig");
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        AppConfig config = AppConfigManager.LoadConfig();

        if (config == null)
        {
            config = new AppConfig();
            AppConfigManager.SaveConfig(config);
        }

        Console.WriteLine("Server Address: " + config.ServerAddress);
        Console.WriteLine("Port: " + config.Port);
        Console.WriteLine("Username: " + config.Username);
        Console.WriteLine("Password: " + config.Password);

        Console.WriteLine("Enter new value for Server Address:");
        string newServerAddress = Console.ReadLine();
        AppConfigManager.SetConfigValue(config, "ServerAddress", newServerAddress);
        AppConfigManager.SaveConfig(config);

        Console.WriteLine("Server Address updated.");

        Console.WriteLine("Server Address: " + config.ServerAddress);
    }
}

在上述代码中,我们修改了AppConfig类,使其继承自ConfigurationSection类,并为每个属性添加了ConfigurationProperty属性,以便将其存储到配置文件中。

AppConfigManager类中新增了SaveConfig方法和LoadConfig方法,用于将配置保存到文件和从文件加载配置。

Main方法中,我们首先尝试加载配置文件,如果配置文件不存在,则创建一个新的配置,并保存到文件中。然后,我们展示了从配置文件中读取参数配置的示例,并演示了如何动态更新配置参数值,并保存到配置文件中。

希望本篇博客能对你有所帮助!如果有任何问题或建议,请随时提出。

标签:反射,string,AppConfig,配置,参数,AppConfigManager,property,config,public
From: https://www.cnblogs.com/jack-jiang0/p/17610637.html

相关文章

  • linux启动服务配置详解
    init进程是所有进程的发起者和控制者。因为在任何基于Unix的系统(比如 linux)中,它都是第一个运行的进程,所以init进程的编号(ProcessID,PID)永远是1。如果init出现了问题,系统的其余部分也就随之而垮掉了。init服务init进程是所有进程的发起者和控制者。因为......
  • 参数ref、out浅析
    out和ref是C#语言中传递参数的关键字,用于在方法调用中修改参数值。它们分别用于输出参数和引用参数。但都可以用于优化代码性能和减少内存分配。out:只出不进,可用于在方法调用中设置输出参数。输出参数是在方法调用过程中分配并返回给调用方的参数。输出参数必须在函数体内初......
  • scp tcpdump 多网卡绑定 永久修改网络相关配置文件
    scptcpdump多网卡绑定 永久修改网络相关配置文件网卡[root@localhost~]#vim/etc/sysconfig/network-scripts/ifcfg-ens33BOOTPROTO=static     //网卡获取地址模式ONBOOT=yes        //开机是否自启动​​IPADDR=192.168.91.105   ......
  • nacos系列:spring cloud使用nacos实现配置管理和服务发现
    目录版本说明创建项目版本说明IDEA:2021.3Maven:3.6.3Jdk:17Spring-Boot:2.6.13Spring-Cloud:2021.0.5Spring-Cloud-Alibaba:2021.0.5.0创建项目1、选择SpringInitalizr2、选择需要安装的版本和依赖3、修改pom文件<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns......
  • 【MySQL入门到精通-黑马程序员】MySQL基础篇-概述及MySQL环境配置
    前言本专栏文章为观看黑马程序员《MySQL入门到精通》所做笔记,课程地址在这。如有侵权,立即删除。一、MySQL概述1.1数据库相关概念数据库(DataBase(DB)):存储数据的仓库,数据是有组织的进行存储。数据库管理系统(DataBaseManagementSystem(DBMS)):操纵和管理数据库的大型软件。SQL(StructureQ......
  • 【Nacos篇】Nacos基本操作及配置
    官方文档:https://nacos.io/zh-cn/docs/v2/ecology/use-nacos-with-spring-cloud.html前置条件:SpringCloud脚手架单机模式下的Nacos控制台:<dependencies><!--Registry注册中心相关--><dependency><groupId>com.alibaba.cloud</group......
  • 部署Nginx配置动静分离
    一、Nginx正则表达式和动静分离1、Nginx处理动态网站数据的方式 1)动静分离 静态请求Nginx处理 动态请求通过Nginx正则表达式转发到LAMP平台 2)LNMP处理  Nginx服务器配置php通过php-fpm处理php语言2、Nginx功能  1)网站服务器  默认只能处理静态数据 处理客户......
  • PID控制的总结 — 概念与参数整定
    前面的文章已经针对PID进行过分析:PID是比例、积分、微分的三种控制方式组合成的控制算法的称谓。在使用PID算法进行控制的时候,难点往往都不是怎么样去用代码实现,而是PID控制器的参数整定。PID参数整定是非常关键的,这些参数的设置影响了PID控制算法的快速性、稳定性。所以正确地理解......
  • 1.创建一个类,类A中定义了一个方法,该方法能接受3个参数根据参数判断是做加法还是减法并
    classA:defcal(self,x,y,z):ifz=='+':returnx+yifz=='-':returnx-yelse:print('error')a=A()b=a.cal(3,4,'+')print(b)运行结果: 2.延伸:创建一个类,类B......
  • Idea-EasyCode插件配置
    1.Idea插件设置1.1.EasyCode插件  具体操作省略,按照后如下截图:    1.2.EasyCode模板1.2.1模板清单 1.2.2模板-MybatisPlusConfig.vm##设置回调$!callback.setFileName($tool.append("MybatisPlusConfig",".java"))$!callback.setSavePath($tool.append($tab......