看同事使用的 一个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 +反射 来对两个类之间动态赋值的更多相关文章

  1. 【java回调】java两个类之间的回调函数传递

    背景交代:熟悉用js开发的cordovaAPP:对java一窍不通的我,老师让做一个监测用户拍照事件的功能,无奈没有找到现成的库,无奈自己动手开发java插件~~0基础java GreenHand,祝 ...

  2. python两个类之间变量和函数的调用

    1.class_a() class_b() 2.class_b使用class_a中的变量和函数 3.变量class_a中:class_a.num=... 函数class_b中:先实例化class_a( ...

  3. ArrayList两个对象之间的赋值

    List<String> list1 = new ArrayList<String>(); List<String> list2 = new ArrayList&l ...

  4. c++两个类相互调用

    有可能会碰到两个类之间的相互调用的问题,例如:定义了类A和类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { B b; }; class B { A a; }; 编译器在声明A ...

  5. C++两个类相互包含引用的问题

    在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { B b; } class B { A* a; } 请 ...

  6. C++中两个类相互include的问题

    在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 例如: Cup.h #ifndef CUP_H #define CUP_ ...

  7. C++中两个类相互包含引用问题

    在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { int i; B b; } class B { in ...

  8. Javers 比较两个类的差异

    Javers 在开发过程中遇到需求,比较数据库中的原数据与新修改要写入库中的数据.这个实体类是比较复杂的.例如有基本类型,BigDecimal类型,自定义类型,Date类型,List集合,Set集合, ...

  9. Java-类与类之间的关系

    类与类之间的几种关系   一.继承关系      继承指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力.在Java中继承关系通过关键字exte ...

随机推荐

  1. C# 学习的随笔【随时更新】

    1.结束自己 Application.Exit(); //这个东西有重载函数

  2. 关于显示gif的一些方法与讨论

    http://www.2cto.com/kf/201404/292468.html http://www.eoeandroid.com/forum.php?mod=viewthread&tid ...

  3. 【翻译习作】 Windows Workflow Foundation程序开发-第一章02

    1.2      Windows Workflow概览 微软的Windows Workflow Foundation(简称WF)是.NET框架3.0版的一部分..NET3.0其它主要部分是Window ...

  4. word2010忽然无法撤销

    转:http://tieba.baidu.com/p/1115124288     第三楼 关闭正在运行的所有程序. 按Win-R,在运行框中键入regedit,然后单击“确定”. 在注册表编辑器中, ...

  5. QTP动态加载对象库

    Public Function AddObjectRepository(path) On Error Resume Next Dim pos, repath If instr(path,". ...

  6. while((c = getchar()) != EOF)(键盘输入问题)

    问题描述: 样例输入:O S 样例输出:I A 代码实现: #include <stdio.h> char *s = "`1234567890-=qwertyuiop[]\\as ...

  7. sublime Text及package control的安装

    1.下载并安装sublime Text2http://www.baidu.com/s?wd=sublime&rsv_spt=1&issp=1&f=8&rsv_bp=0& ...

  8. Leetcode027. Remove Element

    //water class Solution { public: int removeElement(vector<int>& nums, int val) { for(vecto ...

  9. spring+hibernate--直接修改数据库,再通过hibernate查询数据不变

    这个问题已经很多天了,一直没有时间解决,不过还好是自己的项目,没什么影响. 刚好今天没事,想好好解决一下这个问题. hibernate主要配置如下: <property name="h ...

  10. linux进程状态

    系统维护的时候难免会遇到进程的状态的查询和管理,到底什么是R,有的是S,有的还是S+呢?一直有些混沌的问题,今天细细的来总结一下: ps是用来报告系统中程序执行状况的命令这个是无可厚非的,linux进 ...