使用反射复制对象有什么缺点吗?
There is any drawback in using reflection to copy objects?
我正在使用反射在实现相同接口的对象之间复制数据,一切似乎都工作正常,但在部署到生产环境之前我想问:有什么理由我应该避免这样做吗?
我之前使用硬编码属性的实现无法检测到对界面的添加,也无法避免我或我的团队错误地将 属性 复制到另一个相同类型。
另外,我在静态字典上缓存属性按类型,这有什么好处还是我只是加倍了 CLR 字典?
以所述方式使用反射有两个主要问题:
一般会比直接写代码慢,有时会慢的很厉害。
它假定所有要复制的信息都可以以相同的方式访问。
虽然有时可以使用反射为 类 生成代理对象,其功能可以很好地映射到接口,但不能修改以实际实现它,我建议如果你控制类 和接口,您应该在接口中包含复制对象所需的所有功能,以避免即使添加了新功能也需要使用反射(例如,定义方法以使用从旧复制的数据构造新对象那些——包括调用者可能不知道的数据)。
您之前实施的另一种替代方法是使用 AutoMapper 这样的工具,这样您就不必自己编写映射代码。
我正在使用反射在实现相同接口的对象之间复制数据,一切似乎都工作正常,但在部署到生产环境之前我想问:有什么理由我应该避免这样做吗?
我之前使用硬编码属性的实现无法检测到对界面的添加,也无法避免我或我的团队错误地将 属性 复制到另一个相同类型。
另外,我在静态字典上缓存属性按类型,这有什么好处还是我只是加倍了 CLR 字典?
以所述方式使用反射有两个主要问题:
一般会比直接写代码慢,有时会慢的很厉害。
它假定所有要复制的信息都可以以相同的方式访问。
虽然有时可以使用反射为 类 生成代理对象,其功能可以很好地映射到接口,但不能修改以实际实现它,我建议如果你控制类 和接口,您应该在接口中包含复制对象所需的所有功能,以避免即使添加了新功能也需要使用反射(例如,定义方法以使用从旧复制的数据构造新对象那些——包括调用者可能不知道的数据)。
您之前实施的另一种替代方法是使用 AutoMapper 这样的工具,这样您就不必自己编写映射代码。