zoukankan      html  css  js  c++  java
  • C#动态属性赋值/取值

    1.给已有对象属性赋值(批量设置属性值)

    /// <summary>
    /// 给现有对象属性赋值
    /// </summary>
    /// <param name="obj">对象</param>
    /// <param name="nameValue">{ 属性名, 属性值 }</param>
    private void SetPropertyValue(object obj, Dictionary<string, object> nameValue) {
        foreach (PropertyInfo pi in obj.GetType().GetProperties()) {
            if (nameValue.TryGetValue(pi.Name, out var outObj)) {
                Type outType = outObj.GetType();
                if (outType == pi.PropertyType) {
                    pi.SetValue(obj, outObj, null);
                }
            }
        }
    }
    

    使用如下:

    [Test]
    public void Test()
    {
           var myCar = new Car();
           var typeData = new Dictionary<string, object> { { "Color", "Blue" } };
           SetPropertyValue(myCar, typeData);
           Assert.AreEqual("Blue", myCar.Color);
    }
    
    internal class Car
    {
        public String Color { get; set; }
    }
    

    2.返回一个新对象(批量设置属性值)

    private T SetPropertyValue<T>(Dictionary<string, object> nameValue) {
              T generic = (T)Activator.CreateInstance<T>();
              foreach (PropertyInfo pi in typeOf(T).GetProperties()) {
                  if (nameValue.TryGetValue(pi.Name, out var outObj)) {
                      Type outType = outObj.GetType();
                      if (outType == pi.PropertyType) {
                          pi.SetValue(generic, outObj, null);
                      }
                  }
              }
              return generic;
          }
    

    使用如下:

    [Test]
    public void Test()
    {
           var typeData = new Dictionary<string, object> { { "Color", "Blue" } };
           var myCar = SetPropertyValue<Car>(typeData);
           Assert.AreEqual("Blue", myCar.Color);
    }
    
    internal class Car
    {
        public String Color { get; set; }
    }
    

    3.也可以直接操作

    a.通过属性名(字符串)获取对象属性值

     User u = new User();
     u.Name = "lily";
     var propName = "Name";
     var propNameVal = u.GetType().GetProperty(propName).GetValue(u, null);
     
     Console.WriteLine(propNameVal);// "lily"
    

    b.通过属性名(字符串)设置对象属性值

     User u = new User();
     u.Name = "lily";
     var propName = "Name";
     var newVal = "MeiMei";
     u.GetType().GetProperty(propName).SetValue(u, newVal);
     
     Console.WriteLine(propNameVal);// "MeiMei"
    

    作者:大可 • Duke

    出处:

    声明:本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载(请注明出处)。
  • 相关阅读:
    Log4j的配置
    Linux笔记
    面对一个个路口
    切图布局知识点(四)——不定宽有背景文字块居中
    切图布局知识点(三)——左右布局
    切图布局知识点(二)——高度100%
    切图布局知识点(一)
    window下静默执行python脚本
    mysql 允许远程连接
    linux 防火墙
  • 原文地址:https://www.cnblogs.com/xuke/p/13640041.html
Copyright © 2011-2022 走看看