使用 Attribute +反射 来对两个类之间动态赋值
看同事使用的 一个ORM 框架 中 有这样一个功能 通过特性(附加属性)的功能来 实现的两个类对象之间动态赋值的 功能
觉得这个功能不错,但是同事使用的 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 = "", Name = ""};
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 效率其实也还不错。
使用 Attribute +反射 来对两个类之间动态赋值的更多相关文章
- 【java回调】java两个类之间的回调函数传递
背景交代:熟悉用js开发的cordovaAPP:对java一窍不通的我,老师让做一个监测用户拍照事件的功能,无奈没有找到现成的库,无奈自己动手开发java插件~~0基础java GreenHand,祝 ...
- python两个类之间变量和函数的调用
1.class_a() class_b() 2.class_b使用class_a中的变量和函数 3.变量class_a中:class_a.num=... 函数class_b中:先实例化class_a( ...
- ArrayList两个对象之间的赋值
List<String> list1 = new ArrayList<String>(); List<String> list2 = new ArrayList&l ...
- c++两个类相互调用
有可能会碰到两个类之间的相互调用的问题,例如:定义了类A和类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { B b; }; class B { A a; }; 编译器在声明A ...
- C++两个类相互包含引用的问题
在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { B b; } class B { A* a; } 请 ...
- C++中两个类相互include的问题
在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 例如: Cup.h #ifndef CUP_H #define CUP_ ...
- C++中两个类相互包含引用问题
在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { int i; B b; } class B { in ...
- Javers 比较两个类的差异
Javers 在开发过程中遇到需求,比较数据库中的原数据与新修改要写入库中的数据.这个实体类是比较复杂的.例如有基本类型,BigDecimal类型,自定义类型,Date类型,List集合,Set集合, ...
- Java-类与类之间的关系
类与类之间的几种关系 一.继承关系 继承指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力.在Java中继承关系通过关键字exte ...
随机推荐
- net start mysql服务名无效
解决方案:(参考以下命令) 1.win+R键输入cmd敲回车进入dos界面: 2.输入cd d:/mysql-5.5.25/bin敲回车,发现没变化: 3.输入d:敲回车,定位到d:\mysql-5. ...
- Kindle3与亚马逊
喜欢上亚马逊,偶尔会买些免费或极低价格的书,但始终无法把这些书传到“我的”kindle3上,原因是kindle3无法在中国注册,又绕不开DRM,同时经历了换屏.换主板,早已不是原来的kindle了.今 ...
- RDD缓存策略
Spark支持将数据集放置在集群的缓存中,以便于数据重用. Spark缓存策略对应的类: class StorageLevel private( private var useDisk_ : Bool ...
- Codeforces Round #218 (Div. 2) C. Hamburgers
C. Hamburgers time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- 剑指Offer:面试题16——反转链表(java实现)
问题描述 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的链表的头结点.链表结点如下: public class ListNode { int val; ListNode next = n ...
- 学习练习 java编写西游记人物类
package com.hanqi; public class XiYouJiRenWu { double height; String weapon; String name; void prine ...
- Android STL PORT
ndk中包含了stl对应的库,在$(NKD_HOME)/sources/cxx-stl/stlport/stlport 有关Android NDK的C++ STL开发相关总结如下: 从Android ...
- 配置Android环境遇到的问题及解决办法
配置Android环境遇到的问题及解决办法: 1 环境安装地址 http://pan.baidu.com/s/1jGzNzyI 2 其他: 2.1 安装 2.1.1 安装JDK,JRE 成功安装之后, ...
- leetcode 104
104. Maximum Depth of Binary Tree Given a binary tree, find its maximum depth. The maximum depth is ...
- poj1019_Number_Sequence
这题目关键是打表,haha[k]数组表示的是S1S2..Sk该串结尾所在的位置.然后用n去找n所在的k值,此时haha[k-1]<n<=haha[k].然后再算出从haha[k]位置到n一 ...