C#动态属性赋值/取值

摘要:
1.给已有对象属性赋值(批量设置属性值)//////给现有对象属性赋值//////对象///{属性名,属性值}privatevoidSetPropertyValue(objectobj,DictionarynameVal

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"

免责声明:文章转载自《C#动态属性赋值/取值》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Optaplannerlinux系统中安装R包下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

高通驱动树中的GPIO详解

高通驱动树中的GPIO详解DriveStrength&&tri-state相关概念DriveStrength:表示“驱动强度”。实质电路分析时高阻态可做开路理解。也就是说理论上高阻态不是悬空,它是对地或对电源电阻极大的状态。表示方法高阻态常用字母Z表示。与gpio子系统的交互虽然pinctrl提供了pinctrl_request_gpio()...

关于WINFORM中输入法的设置

关于WINFORM(转移到)John Suna的专栏开发中输入方法的设置,它碰巧遇到了这种问题。网络真的很好:)这是文本集。感谢作者的辛勤工作给您带来的便利。在WINFORM中,我们经常遇到这样的问题:文本输入框中的输入法被禁用或总是更改为全宽输入法。查阅相关数据后,总结如下:(1)Control.ImeMode属性:获取或设置控件的输入方法编辑器模式。此模...

json文件 乱码问题 根本解决办法

1工具→ 定制2单击命令选项卡;3选择上部单选区域中的菜单栏,然后从下拉列表中选择文件;4单击“添加”命令5,在类别中查找文件,找到右侧的高级保存选项,然后单击“确定”6,通过向下移动来调整“文件”菜单中选项的位置。如果你有任何问题,请留言!...

登陆脚本

#!' num_ count+=1其他:lock_ input(用户名)#############1##########_###!...

CentOS7 复制文件夹和移动文件夹

CentOS7在Linux中复制、移动和删除文件的命令有:cp、mv、rm I。文件复制命令cp命令格式:cp[-adfilprsu]源文件(source)目标文件(destination)cp[option]source1source2source3…directory参数描述:-a:指存档,即复制所有目录-d:如果源文件是连接文件(linkfile...

[Oracle]

MyOralceLinux6.5isrunningonVirtualBox.Basicsettingsis4Gmemory,50Ghard-disk,autopartitionwheninstallOL6.5.**Followingseriesofoperationsneedrootprivilege.1.Edit/etc/hostsAddyourhostn...