using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace Dscf.Global.Utils
{
public class ReflectionHelper
{
/// <summary>
/// 创建对象实例
/// </summary>
/// <typeparam name="T">要创建对象的类型</typeparam>
/// <param name="assemblyName">类型所在程序集名称</param>
/// <param name="nameSpace">类型所在命名空间</param>
/// <param name="className">类型名</param>
/// <returns></returns>
public static T CreateInstance<T>(string assemblyName,string nameSpace, string className)
{
try
{
string fullName = nameSpace + "." + className;//命名空间.类型名
//此为第一种写法
Assembly assembly = null;
try
{
assembly = Assembly.Load(assemblyName);
}
catch(Exception ex)
{
string s = assemblyName.ToLower();
s = s.Replace(".dll","");
assembly = Assembly.Load(s);
}
object ect = assembly.CreateInstance(fullName);//加载程序集,创建程序集里面的 命名空间.类型名 实例
return (T)ect;//类型转换并返回
//下面是第二种写法
//string path = fullName + "," + assemblyName;//命名空间.类型名,程序集
//Type o = Type.GetType(path);//加载类型
//object obj = Activator.CreateInstance(o, true);//根据类型创建实例
//return (T)obj;//类型转换并返回
}
catch(Exception e)
{
//发生异常,返回类型的默认值
return default(T);
}
}
/// <summary>
/// 比较两个类中属性发生改变,并返回改变的值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <returns></returns>
public static string GetChangeStrInfo<T>(T told,T tnew)
{
if (told == null || tnew == null)
{
throw new Exception(" told or tnew is null");
}
Type type = typeof(T);
PropertyInfo[] props = type.GetProperties();
StringBuilder builder = new StringBuilder();
string s="";
foreach (PropertyInfo p in props)
{
object oldv = p.GetValue(told, null);
object newv = p.GetValue(tnew, null);
if (oldv != null || newv != null)
{
s = p.Name + "[";
string s1 = oldv != null ? oldv.ToString() : "";
string s2 = newv != null ? newv.ToString() : "";
if (s1 != s2)
{
s += (s1 + "->" + s2+"]");
if (builder.Length > 0) builder.Append(",");
builder.Append(s);
}
}
}
return builder.ToString();
}
/// <summary>
/// 两个对像赋值,只要属性名一样,就赋值,这个用于报表那里
/// </summary>
/// <param name="source"></param>
/// <param name="target"></param>
public static void PropertySetValue(object source, object target)
{
//PropertyInfo[] props = source.GetType().GetProperties();
PropertyInfo[] drProps = target.GetType().GetProperties();
Type sourceType = source.GetType();
foreach (PropertyInfo p in drProps)
{
PropertyInfo sourceProp = sourceType.GetProperty(p.Name);
if (sourceProp != null)
{
if (sourceProp.GetValue(source,null)!=null)
p.SetValue(target, Convert.ChangeType(sourceProp.GetValue(source, null), p.PropertyType), null);
}
}
}
}
}
- Java反射详解及应用示例
反射是Java中最重要的内容之一,了解反射原理对我们学习各种框架具有很大的帮助 反射的原理: 反射应用示例: import java.lang.reflect.Constructor; import ...
- Java 反射实例
实体类:Userpackage com.reflect.model; public class User{ private User(int id, String username, String p ...
- 你以为反射真的无所不能?至少JDK8以后很强大
目录 反射操作方法 Spring的方法的优点 反射如何实现Spring的方法 Java字节码 高级反射注意点 javac的彩蛋 续点 每日一笑 上期答案 # 加入战队 微信公众号 之前我们已经介绍了J ...
- Http网络请求
前提说明: 1.Str.Empty 其实就是 string.Empty 2.@object.IsNull() 的IsNull() 是判断“是否等于null”的扩展方法,等同于 @object==nu ...
- day44-反射03
Java反射03 3.通过反射获取类的结构信息 3.1java.lang.Class类 getName:获取全类名 getSimpleName:获取简单类名 getFields:获取所有public修 ...
- 通过反射感知Redis类里边全部的操作方法
<?php //通过反射感知Redis类里边全部的操作方法 //根据Redis类实例化一个反射类对象 $me = new ReflectionClass('Redis'); //获得Redis类 ...
- 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)
建议106:动态代理可以使代理模式更加灵活 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发.我们知道一个静态代理是通过主题角色(Prox ...
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- 反射 + 抽象工厂模式切换DB数据源(附Demo)
首先,设计模式的文章源自于程杰的<大话设计模式>这本书,这本书个人感觉很适合我,看着不累,能够安安心心的阅读学习.在这里十分感谢程杰的这本书,我博文中的例子会根据书上的例子来.为了不侵犯这 ...
随机推荐
- Python 向上取整的算法
一.初衷: 有时候我们分页展示数据的时候,需要计算页数.一般都是向上取整,例如counts=205 pageCouts=20 ,pages= 11 页. 一般的除法只是取整数部分,达不到要求. 二.方 ...
- mysql5.6优化建议
这篇文章主要介绍了MySQL5.6基本优化配置,详细分解了MySQL5.6需要优化的配置项,最终给出了一个优化案例,需要的朋友可以参考下 随着 大量默认选项的改进, MySQL 5.6比以前版 ...
- php解压 tar.gz 格式文件
1.运用php自带压缩与归档扩展(phar) $phar = new PharData('song.tar.gz'); //路径 要解压的文件 是否覆盖 $phar->extractTo('c: ...
- LNMP安装了哪些软件?安装目录在哪?
LNMP官网:http://lnmp.org/faq/lnmp-software-list.html LNMP一键安装包除去安装所必须的依赖包,还会默认安装以下软件: Nginx.MySQL/Mari ...
- 深入研究java.lang.ThreadLocal类(转)
引用:http://lavasoft.blog.51cto.com/62575/51926/ 一.概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并 ...
- Eclipse Tomcat配置/管理/调试指南
从myeclipse转到Eclipse最不方便的之一莫过于Web项目部署了,老是在想怎么不能把myeclipse的那个移植过来,或者有没有高人能按照Myeclipse开发一个,非常遗憾. 原版的Ecl ...
- [C语言](一)第一个Windows 32 API的窗口程序
#include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain( ...
- python输出重定向
0表示标准输入1表示标准输出2表示标准错误输出> 默认为标准输出重定向,与 1> 相同2>&1 意思是把 标准错误输出 重定向到 标准输出.&>file 意思是 ...
- solr学习之添加文档
一.开篇语 其实Solr就是一个你可以通过他来查询文档的东西,他整个都是基于Document的,那么这些Document从何而来列? 当然是我们给他,而这些来源就包括了:数据库文件,XML,Json ...
- expdp导出数据库
源地址:http://www.cnblogs.com/luluping/archive/2010/03/16/1687093.html 使用EXPDP和IMPDP时应该注意的事项: EXP和IMP是客 ...