这听起来可能吗?
是的,但是快速而肮脏的方法是使用反射,与常规属性调用相比,这将导致巨大的(30-100 倍)性能损失。这对您可能很重要,也可能无关紧要。
如果你走反射路线,你可以:
- 通过在要修改的实例上调用 GetType() 来发现类型信息
- 使用Type.GetProperties()发现所有公共属性
- 检查
PropertyInfo
属性是字符串还是可枚举字符串
PropertyInfo
从对象获取 get 访问器:GetGetMethod()
- 获取价值
- 转换价值
- 使用 set 访问器设置值
GetSetMethod()
对于IEnumerable
,您需要做一些额外的工作,即通过后期绑定调用获取集合,然后枚举它。根据您的类型,您可能还需要忽略某些属性、修改字段等。
如果我必须这样做(并且我怀疑这是否是解决问题的正确方法),我将使用反射扫描对象的接口一次,并为每个属性创建动态getter/setter 并将它们缓存在基于 Dictionary 的在类型上。随后处理对象的请求将使用这些缓存的方法并实现类似于正常 get/set 调用的性能。
如果您熟悉 IL 生成和/或表达式树,则枚举处理起来会有点麻烦,但非常可行。
几个人正在研究这个问题,他们有时会忘记在客户端触发编码。
我认为代码的设计应该让开发人员的生活更轻松,但你怎么能解释人们忘记了什么?我不反对防弹代码,但谁知道还有什么会被遗忘。只是一个想法。