C#、Python中分别是怎么实现通过字符串获取实体类的值以及给实体类赋值
一、引入
最近遇到一个项目里面的功能,在给实体类赋值的时候,由于赋值字段是动态生成的,所以如果用常用的方法(直接实体类的名称.字段名=要赋的值),将会生成很多无用的代码,所以找到了一个通过反射的赋值与取值的方法,顺便总结一下,以及对比一下与Python语言同样实现该功能的区别之处。
二、C#
1.赋值
2.取值
3.源码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
#region 通过字符串设置实体类的值
//初始化一个实体类
//Student model_stu = new Student();
//string id_str = "stu_id";
//string name_str = "stu_name";
//string addr_str = "stu_address";
//Type type = model_stu.GetType();//获取类型
//PropertyInfo property_info_id = type.GetProperty(id_str);
//PropertyInfo property_info_name = type.GetProperty(name_str);
//PropertyInfo property_info_addr = type.GetProperty(addr_str); //property_info_id.SetValue(model_stu, 5);
//property_info_name.SetValue(model_stu, "李四");
//property_info_addr.SetValue(model_stu, "北京市"); //Console.WriteLine(model_stu.stu_id);
//Console.WriteLine(model_stu.stu_name);
//Console.WriteLine(model_stu.stu_address);
//Console.ReadKey();
#endregion #region 通过字符串获取实体类的值
//初始化一个实体类
Student model_stu = new Student()
{
stu_id = ,
stu_name = "张三",
stu_address = "上海市"
};
string id_str = "stu_id";
string name_str = "stu_name";
string addr_str = "stu_address";
Type type = model_stu.GetType();//获取类型
PropertyInfo property_info_id = type.GetProperty(id_str);
PropertyInfo property_info_name = type.GetProperty(name_str);
PropertyInfo property_info_addr = type.GetProperty(addr_str); Console.WriteLine(property_info_id.GetValue(model_stu));
Console.WriteLine(property_info_name.GetValue(model_stu));
Console.WriteLine(property_info_addr.GetValue(model_stu));
Console.ReadKey();
#endregion }
}
public class Student
{
public int stu_id { get; set; }
public string stu_name { get; set; }
public string stu_address { get; set; }
}
}
三、Python
1.截图
2.源码
__author__ = "JentZhang" # 实体类
class Student:
def __init__(self, id, name, addr):
self.id = id
self.name = name
self.addr = addr def main():
stu = Student(1, '张三', '上海市')
v_id = 'id'
v_name = 'name'
v_addr = 'addr'
print(hasattr(stu, v_id)) # 是否有该属性
print(hasattr(stu, 'sex')) # 是否有该属性
print('=========================')
print(getattr(stu, v_id, 5)) # 获取属性值,如果没有改属性,则可以设置返回默认值,这里的默认值设置为5
print(getattr(stu, v_name, '李四')) # 获取属性值,如果没有改属性,则可以设置返回默认值,有该属性
print(getattr(stu, 'abc', '李四')) # 获取属性值,如果没有改属性,则可以设置返回默认值,没有该属性
print('=========================')
setattr(stu, v_id, 1000) #设置属性对应的值
setattr(stu, v_name, '王五') #设置属性对应的值
setattr(stu, v_addr, '北京市') #设置属性对应的值 print(stu.id)
print(stu.name)
print(stu.addr) if __name__ == '__main__':
main()
四、总结
个人更喜欢Python的处理方式,非常灵活,大爱Python。
C#、Python中分别是怎么实现通过字符串获取实体类的值以及给实体类赋值的更多相关文章
- python中的printf:%号拼接字符串和format函数
在C语言中,我们使用printf("%s","hello")这种形式进行字符串的拼接 在python中,进行这样的拼接有两种实现方式,分别是%号拼接以及使用fo ...
- python中的is判断引用的对象是否一致,==判断值是否相等
python中的is判断引用的对象是否一致,==判断值是否相等 a = 10 b = 20 list = [1,2,3,4,5] print(a in list) print(b not in lis ...
- 快速理解Python中使用百分号占位符的字符串格式化方法中%s和%r的输出内容的区别
<Python中使用百分号占位符的字符串格式化方法中%s和%r的输出内容有何不同?>老猿介绍了二者的区别,为了快速理解,老猿在此使用另外一种方式补充说明一下: 1.使用%r是调用objec ...
- Python中使用百分号占位符的字符串格式化方法中%s和%r的输出内容有何不同?
Python中使用百分号占位符的字符串格式化方法中%s和%r表示需要显示的数据对应变量x会以str(x)还是repr(x)输出内容展示. 关于str和repr的关系请见: <Python中rep ...
- Python中使用%还是format来格式化字符串?
Python中应该使用%还是format来格式化字符串? %还是format Python中格式化字符串目前有两种阵营:%和format,我们应该选择哪种呢? 自从Python2.6引入了form ...
- python中subprocess.Popen执行命令并持续获取返回值
先举一个Android查询连接设备的命令来看看Python中subprocess.Popen怎么样的写法.用到的命令为 adb devices. import subprocess order='ad ...
- Python中的列表,元组,字符串之间的相互转化
Python中的列表元组和字符串之间的相互转化需要利用,tuple(),list(),str(). 示例如下: >>> the_string = "hello I'am x ...
- 对于Python中的字节串bytes和字符串以及转义字符的新的认识
事情的起因是之前同学叫我帮他用Python修改一个压缩包的二进制内容用来做fuzz,根据他的要求,把压缩包test.rar以十六进制的方式打开,每次修改其中一个十六进制字符串并保存为一个新的rar用来 ...
- javascript中json对象json数组json字符串互转及取值
今天用到了json数组和json对象和json类型字符串之间互转及取值,记录一下: 1.json类型的字符串转换为json对象及取值 var jsonString = '{"bar" ...
随机推荐
- junit 方法:assertEquals 和 assertTrue
assertEquals 和 assertTrue 区别相同之处:都能判断两个值是否相等 assertTrue 如果为true,则运行success,反之Failure assertEquals 如果 ...
- Akka-CQRS(4)- CQRS Writer Actor 示范
我觉着,CQRS的写部分最核心.最复杂的部分应该是Writer-Actor了.其它的监管(supervising).分片部署等都比较规范,没太多的变动.几乎Writer-Actor所有的业务逻辑都在R ...
- 脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手
.引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道“三次”和“四次”,但是如果问深入一点,他们往往都无法作出准确回答. 本篇文章尝试使用动画图片的方 ...
- 微信小程序中如何使用WebSocket实现长连接(含完整源码)
本文由腾讯云技术团队原创,感谢作者的分享. 1.前言 微信小程序提供了一套在微信上运行小程序的解决方案,有比较完整的框架.组件以及 API,在这个平台上面的想象空间很大.腾讯云研究了一番之后,发现 ...
- Metasploit Framework(5)弱点扫描
文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 当我们发现了目标机器开放的端口,开启的服务等等之后 就 ...
- Kali学习笔记18:OpenVAS使用
上一篇讲了什么是OpenVAS以及如何安装: https://www.cnblogs.com/xuyiqing/p/9690373.html 接下来就是使用: 我先打开一台Metasploitable ...
- 在ubuntu下搜索文件的几种方式
1.whereis 文件名 特点:快速,但是是模糊查找,例如 找 #whereis mysql 它会把mysql,mysql.ini,mysql.*所在的目录都找出来.我一般的查找都用这条命令. 2. ...
- HashMap 和 Hashtable 的 6 个区别,最后一个没几个人知道!
HashMap 和 Hashtable 是 Java 开发程序员必须要掌握的,也是在各种 Java 面试场合中必须会问到的. 但你对这两者的区别了解有多少呢? 现在,栈长我给大家总结一下,或许有你不明 ...
- 深入Vue2.x的虚拟DOM diff原理
一.前言 Vue的核心是双向绑定和虚拟DOM(下文我们简称为vdom),关于双向绑定可以参阅木琴的文章<剖析Vue原理&实现双向绑定MVVM>,vdom是树状结构,其节点为vnod ...
- Python爬虫、自动化常用库&帮助文档URL
一.Python下载地址 Windows终端Cmder.exe下载--->http://cmder.net/ Python下载(Windows) ---> https://w ...