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

    出处:

    声明:本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载(请注明出处)。
  • 相关阅读:
    Java 正则表达式
    Java 设计模式系列(二三)访问者模式(Vistor)
    Java 设计模式系列(十五)观察者模式(Observer)
    Java 设计模式系列(十八)备忘录模式(Memento)
    Java 设计模式系列(二十)状态模式
    Java 设计模式系列(十五)迭代器模式(Iterator)
    Java 设计模式系列(十三)模板方法
    Java 设计模式系列(十二)策略模式(Strategy)
    Java 设计模式系列(二二)责任链模式
    Java 设计模式系列(十四)命令模式(Command)
  • 原文地址:https://www.cnblogs.com/xuke/p/13640041.html
Copyright © 2011-2022 走看看