• [CSharp]传一个包含多个属性的对象,只改变其中个别属性值的方法


    需求

    假如有这么一个需求,一个对象Person内的属性设置外包给了另外一个类Options

    而要设这个Person对象的属性,就必须传一个Options实例,

    但又不能每个属性重新设一遍,只设要修改的属性。

    • 基础代码
    public class Options
    {
        public string Name { get; set; } = "";
        public int Age { get; set; } = 0;
        public string Gerder { get; set; } = "";
    }
    
    public class Person
    {
        public void SetOptions(Options options)
        {
            // 思考一下这里的实现方式
        }
        private Options myOpts = new Options();
    }
    
    
    • 调用代码
    var p = new Person();
    
    var opts = new Options()
    {
        Name = "Hepburn",
        Age = 18,
        Gerder = "Female"
    };
    
    p.SetOptions(opts);
    
    /*
     * p
     *  |_Name: Hepburn
     *  |_Age: 18
     *  |_Gender: Female
     *  
    
        p.SetOptions(new Options() { Age = 19 });
    
     *  ↓↓↓
     *  
     * p
     *  |_Name: Hepburn
     *  |_Age: 19
     *  |_Gender: Female
     *  
    */
    
    p.SetOptions(new Options() { Age = 19 });
    

    • 答案区

    public void SetOptions(Options options)
    {
            foreach (var p in options.GetType().GetProperties())
            {
                if(!p.CanWrite) continue;
    
                var value = p.GetValue(options);
    
                var valDefault = p.GetValue(new Options());
    
                if(value != valDefault)
                {
                    p.SetValue(myOpts, value);
                }
            }
    }
    

    这样,任何有指定值的时候都会被设上,同时,要求默认值都是没有意义的,比如 -1(负一),null 等,因为,设过一次之后,通过这种方法就再也改不回默认值了。

    作者:码路工人

    公众号:码路工人有力量(Code-Power)

    欢迎关注个人微信公众号 Coder-Power

    一起学习提高吧~

  • 相关阅读:
    爬虫学习
    手刃爬虫豆瓣
    爬虫学习
    爬虫学习
    安卓学习新
    安卓知识点
    随手快递app开发的第十天
    随手快递app冲刺2开发的第九天
    随手快递app冲刺2开发的第八天
    随手快递app冲刺2开发的第七天
  • 原文地址:https://www.cnblogs.com/CoderMonkie/p/CSharp-use-reflection.html
Copyright © 2020-2023  润新知