电脑疯子技术论坛|电脑极客社区

微信扫一扫 分享朋友圈

已有 2002 人浏览分享

.net 反射辅助类[源码分享]---希望对大家有所帮助

[复制链接]
2002 4

  1. using System;
  2. using System.Reflection;
  3. using System.Data;
  4. using System.Drawing;
  5. using System.Resources;
  6. using System.ComponentModel;
  7. using System.Text;
  8. using System.IO;
  9. namespace Svnhost.Common
  10. {
  11.     /// <summary>
  12.     /// 反射辅助类
  13.     /// </summary>
  14.     /// <remarks>
  15.     /// Author: Ridge Wong
  16.     /// Version: 1.0.0.0 2008-8-7
  17.     /// </remarks>
  18.     public static class ReflectHelper
  19.     {
  20.         #region 成员读写
  21.         /// <summary>
  22.         /// 通过数据行填充实体类型
  23.         /// </summary>
  24.         /// <param name="model">实体对象</param>
  25.         /// <param name="dRow">数据行</param>
  26.         public static void FillInstanceValue(object model, DataRow dRow)
  27.         {
  28.             Type type = model.GetType();
  29.             for (int i = 0; i < dRow.Table.Columns.Count; i++)
  30.             {
  31.                 PropertyInfo property = type.GetProperty(dRow.Table.Columns[i].ColumnName);
  32.                 if (property != null)
  33.                 {
  34.                     property.SetValue(model, dRow[i], null);
  35.                 }
  36.             }
  37.         }
  38.         /// <summary>
  39.         /// 通过数据只读器填充实体类型
  40.         /// </summary>
  41.         /// <param name="model">实体对象</param>
  42.         /// <param name="dr">数据只读器</param>
  43.         public static void FillInstanceValue(object model, IDataReader dr)
  44.         {
  45.             Type type = model.GetType();
  46.             for (int i = 0; i < dr.FieldCount; i++)
  47.             {
  48.                 PropertyInfo property = type.GetProperty(dr.GetName(i));
  49.                 if (property != null)
  50.                 {
  51.                     property.SetValue(model, dr[i], null);
  52.                 }
  53.             }
  54.         }
  55.         /// <summary>
  56.         /// 获取实体相关属性的值
  57.         /// </summary>
  58.         /// <param name="obj"></param>
  59.         /// <param name="propertyName"></param>
  60.         /// <returns></returns>
  61.         public static object GetInstanceValue(object obj, string propertyName)
  62.         {
  63.             object objRet = null;
  64.             if (!string.IsNullOrEmpty(propertyName))
  65.             {
  66.                 PropertyDescriptor descriptor = TypeDescriptor.GetProperties(obj).Find(propertyName, true);
  67.                 if (descriptor != null)
  68.                 {
  69.                     objRet = descriptor.GetValue(obj);
  70.                 }
  71.             }
  72.             return objRet;
  73.         }
  74.         #endregion
  75.         #region 方法调用
  76.         /// <summary>
  77.         /// 直接调用内部对象的方法/函数或获取属性(支持重载调用)
  78.         /// </summary>
  79.         /// <param name="refType">目标数据类型</param>
  80.         /// <param name="funName">函数名称,区分大小写。</param>
  81.         /// <param name="objInitial">如果调用属性,则为相关对象的初始化数据,否则为Null。</param>
  82.         /// <param name="funParams">函数参数信息</param>
  83.         /// <returns>运行结果</returns>
  84.         public static object InvokeMethodOrGetProperty(Type refType, string funName, object[] objInitial, params object[] funParams)
  85.         {
  86.             MemberInfo[] mis = refType.GetMember(funName);
  87.             if (mis.Length < 1)
  88.             {
  89.                 throw new InvalidProgramException(string.Concat("函数/方法 [", funName, "] 在指定类型(", refType.ToString(), ")中不存在!"));
  90.             }
  91.             else
  92.             {
  93.                 MethodInfo targetMethod = null;
  94.                 StringBuilder pb = new StringBuilder();
  95.                 foreach (MemberInfo mi in mis)
  96.                 {
  97.                     if (mi.MemberType != MemberTypes.Method)
  98.                     {
  99.                         if (mi.MemberType == MemberTypes.Property)
  100.                         {
  101.                             #region 调用属性方法Get
  102.                             targetMethod = ((PropertyInfo)mi).GetGetMethod();
  103.                             break;
  104.                             #endregion
  105.                         }
  106.                         else
  107.                         {
  108.                             throw new InvalidProgramException(string.Concat("[", funName, "] 不是有效的函数/属性方法!"));
  109.                         }
  110.                     }
  111.                     else
  112.                     {
  113.                         #region 检查函数参数和数据类型 绑定正确的函数到目标调用
  114.                         bool validParamsLen = false, validParamsType = false;
  115.                         MethodInfo curMethod = (MethodInfo)mi;
  116.                         ParameterInfo[] pis = curMethod.GetParameters();
  117.                         if (pis.Length == funParams.Length)
  118.                         {
  119.                             validParamsLen = true;
  120.                             pb = new StringBuilder();
  121.                             bool paramFlag = true;
  122.                             int paramIdx = 0;
  123.                             #region 检查数据类型 设置validParamsType是否有效
  124.                             foreach (ParameterInfo pi in pis)
  125.                             {
  126.                                 pb.AppendFormat("Parameter {0}: Type={1}, Name={2}\n", paramIdx, pi.ParameterType, pi.Name);
  127.                                 //不对Null和接受Object类型的参数检查
  128.                                 if (funParams[paramIdx] != null && pi.ParameterType != typeof(object) &&
  129.                                      (pi.ParameterType != funParams[paramIdx].GetType()))
  130.                                 {
  131.                                     #region 检查类型是否兼容
  132.                                     try
  133.                                     {
  134.                                         funParams[paramIdx] = Convert.ChangeType(funParams[paramIdx], pi.ParameterType);
  135.                                     }
  136.                                     catch (Exception)
  137.                                     {
  138.                                         paramFlag = false;
  139.                                     }
  140.                                     #endregion
  141.                                     //break;
  142.                                 }
  143.                                 ++paramIdx;
  144.                             }
  145.                             #endregion
  146.                             if (paramFlag == true)
  147.                             {
  148.                                 validParamsType = true;
  149.                             }
  150.                             else
  151.                             {
  152.                                 continue;
  153.                             }
  154.                             if (validParamsLen && validParamsType)
  155.                             {
  156.                                 targetMethod = curMethod;
  157.                                 break;
  158.                             }
  159.                         }
  160.                         #endregion
  161.                     }
  162.                 }
  163.                 if (targetMethod != null)
  164.                 {
  165.                     object objReturn = null;
  166.                     #region 兼顾效率和兼容重载函数调用
  167.                     try
  168.                     {
  169.                         object objInstance = System.Activator.CreateInstance(refType, objInitial);
  170.                         objReturn = targetMethod.Invoke(objInstance, BindingFlags.InvokeMethod, Type.DefaultBinder, funParams,
  171.                             System.Globalization.CultureInfo.InvariantCulture);
  172.                     }
  173.                     catch (Exception)
  174.                     {
  175.                         objReturn = refType.InvokeMember(funName, BindingFlags.InvokeMethod, Type.DefaultBinder, null, funParams);
  176.                     }
  177.                     #endregion
  178.                     return objReturn;
  179.                 }
  180.                 else
  181.                 {
  182.                     throw new InvalidProgramException(string.Concat("函数/方法 [", refType.ToString(), ".", funName,
  183.                         "(args ...) ] 参数长度和数据类型不正确!\n 引用参数信息参考:\n",
  184.                         pb.ToString()));
  185.                 }
  186.             }
  187.         }
  188.         /// <summary>
  189.         /// 调用相关实体类型的函数方法
  190.         /// </summary>
  191.         /// <param name="refType">实体类型</param>
  192.         /// <param name="funName">函数名称</param>
  193.         /// <param name="funParams">函数参数列表</param>
  194.         /// <returns>调用该函数之后的结果</returns>
  195.         public static object InvokeFunction(Type refType, string funName, params object[] funParams)
  196.         {
  197.             return InvokeMethodOrGetProperty(refType, funName, null, funParams);
  198.         }
  199.         #endregion
  200.         #region 资源获取
  201.         /// <summary>
  202.         /// 获取程序集资源的位图资源
  203.         /// </summary>
  204.         /// <param name="assemblyType">程序集中的某一对象类型</param>
  205.         /// <param name="resourceHolder">资源的根名称。例如,名为“MyResource.en-US.resources”的资源文件的根名称为“MyResource”。</param>
  206.         /// <param name="imageName">资源项名称</param>
  207.         public static Bitmap LoadBitmap(Type assemblyType, string resourceHolder, string imageName)
  208.         {
  209.             Assembly thisAssembly = Assembly.GetAssembly(assemblyType);
  210.             ResourceManager rm = new ResourceManager(resourceHolder, thisAssembly);
  211.             return (Bitmap)rm.GetObject(imageName);
  212.         }
  213.         /// <summary>
  214.         ///  获取程序集资源的文本资源
  215.         /// </summary>
  216.         /// <param name="assemblyType">程序集中的某一对象类型</param>
  217.         /// <param name="resName">资源项名称</param>
  218.         /// <param name="resourceHolder">资源的根名称。例如,名为“MyResource.en-US.resources”的资源文件的根名称为“MyResource”。</param>
  219.         public static string GetStringRes(Type assemblyType, string resName, string resourceHolder)
  220.         {
  221.             Assembly thisAssembly = Assembly.GetAssembly(assemblyType);
  222.             ResourceManager rm = new ResourceManager(resourceHolder, thisAssembly);
  223.             return rm.GetString(resName);
  224.         }
  225.         /// <summary>
  226.         /// 获取程序集嵌入资源的文本形式
  227.         /// </summary>
  228.         /// <param name="assemblyType">程序集中的某一对象类型</param>
  229.         /// <param name="charset">字符集编码</param>
  230.         /// <param name="ResName">嵌入资源相对路径</param>
  231.         /// <returns>如没找到该资源则返回空字符</returns>
  232.         public static string GetManifestString(Type assemblyType, string charset, string ResName)
  233.         {
  234.             Assembly asm = Assembly.GetAssembly(assemblyType);
  235.             Stream st = asm.GetManifestResourceStream(string.Concat(assemblyType.Namespace,
  236.                 ".", ResName.Replace("/", ".")));
  237.             if (st == null) { return ""; }
  238.             int iLen = (int)st.Length;
  239.             byte[] bytes = new byte[iLen];
  240.             st.Read(bytes, 0, iLen);
  241.             return (bytes != null) ? Encoding.GetEncoding(charset).GetString(bytes) : "";
  242.         }
  243.         #endregion
  244.     }
  245. }
复制代码



PS:大家觉得好顶顶。鄙视看帖不回的。

评论 4

757338903 757338903  VIP荣誉会员  发表于 2010-11-30 08:05:22 | 显示全部楼层
不懂- -  先占楼~~~~{:283:}

摇摆 摇摆  初级会员  发表于 2010-11-30 11:46:44 | 显示全部楼层
干嘛用的?干嘛用的?

ordinary ordinary  正式会员  发表于 2011-1-1 11:18:28 | 显示全部楼层
我也不是很明白哦

椰子 椰子  正式会员  发表于 2012-5-5 21:26:25 | 显示全部楼层
看不太懂啊看不太懂{:3_236:}

您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

关注

23

粉丝

2901

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Powered by Pcgho! X3.4

© 2008-2022 Pcgho Inc.