使用 Attribute +反射 来对两个类之间动态赋值
2015-09-29 11:50
288 查看
看同事使用的 一个ORM 框架 中 有这样一个功能 通过特性(附加属性)的功能来 实现的两个类对象之间动态赋值的 功能
觉得这个功能不错,但是同事使用的 ORM 并不是我使用的 Dapper 所以就自己写了一个实现同样功能的 工具类出来。
发个贴 为其他有这方面需求的人 来做个参考。 希望大家多提点意见。
请不要吐槽 使用反射 效率问题。 在不加载DLL 的前提下 反射的效率还是很高的。
同样 在实体类只是对 字段经行筛选 判断 的LINQ 效率其实也还不错。
觉得这个功能不错,但是同事使用的 ORM 并不是我使用的 Dapper 所以就自己写了一个实现同样功能的 工具类出来。
发个贴 为其他有这方面需求的人 来做个参考。 希望大家多提点意见。
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Xml.Serialization; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { AnimalTypeTestClass testClass = new AnimalTypeTestClass() { Age = "1", Name = "2"}; Na a = (Na)ClassToHellp.Map<Na>(testClass); Console.WriteLine(a.MyAge); Console.WriteLine(a.MyName); } } public class ClassToHellp { public static object Map<T>(object os) where T : class, new() { // 被转换的类 var t = new T(); var fieldInfos = t.GetType().GetFields(); foreach (var mInfo in os.GetType().GetFields()) { var mInfoValue = mInfo.GetValue(os); if (mInfoValue == null) continue; foreach (var field in Attribute.GetCustomAttributes(mInfo) .Where(attr => attr.GetType() == typeof(ObjectToTypeAttribute)) .SelectMany(attr => fieldInfos.Where(field => field.Name == ((ObjectToTypeAttribute)attr).Field))) { field.SetValue(t, mInfoValue); } } return t; } } [AttributeUsage(AttributeTargets.Field)] public class ObjectToTypeAttribute : Attribute { public string Field { get; set; } public ObjectToTypeAttribute(string pet) { Field = pet; } } public class AnimalTypeTestClass { [ObjectToType("MyName")] public string Name; [ObjectToType("MyAge")] public string Age; } public class Na { public string MyName; public string MyAge; } }
请不要吐槽 使用反射 效率问题。 在不加载DLL 的前提下 反射的效率还是很高的。
同样 在实体类只是对 字段经行筛选 判断 的LINQ 效率其实也还不错。
相关文章推荐
- less 初试
- [IOS]从零开始搭建基于Xcode7的IOS开发环境和免开发者帐号真机调试运行第一个IOS程序HelloWorld
- APP留存技巧,请给用户一个打开app 的理由
- xib中设置TableView的HeaderView
- 记录一个IT菜鸟的成长之路。
- Tomcat中server.xml文件内各节点详解
- leetcode12
- 【转载,超级实用】C++11 标准新特性: 右值引用与转移语义
- redmine 安装问题记录
- tair(二)--概述
- zeromq的使用:例子分析
- python string to hex,字符串转16进制
- php 取余的两个问题
- Spring MVC password example
- Python 数据排序和列表迭代和列表推导应用
- 应用之间进行跳转,ComponentName的方式
- android中listview里button点击后的状态记录
- ios 除数为0时
- 高手详解SQL性能优化十条经验
- RDD的原理