zoukankan      html  css  js  c++  java
  • 使用反射实例化对象(代码)

    注:目前还不能完全理解“反射”,故只记录代码,待思维成熟后补全理解

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.Threading.Tasks;
      6 using System.Data;
      7 
      8 using System.Reflection;
      9 namespace LoadCode
     10 {
     11     /// <summary>
     12     /// 反射实例化对象
     13     /// </summary>
     14     public class CreateObject
     15     {
     16         public bool Success { get; set; } = true;
     17         public string ErrorMessage { get; set; } = string.Empty;
     18 
     19         private T Invoke<T>(Func<T> func) where T : class, new()
     20         {
     21             T obj = default(T);
     22             try
     23             {
     24                 Success = true;
     25                 ErrorMessage = string.Empty;
     26                 obj = func.Invoke();
     27             }
     28             catch (Exception ex)
     29             {
     30                 Success = false;
     31                 ErrorMessage = string.Format("对象实例化异常:{0}->{1}", ex.Message, ex.StackTrace);
     32             }
     33             return obj;
     34         }
     35 
     36         private List<T> Invoke<T>(Func<List<T>> func) where T : class, new()
     37         {
     38             List<T> objList = new List<T>();
     39             try
     40             {
     41                 Success = true;
     42                 ErrorMessage = string.Empty;
     43                 objList = func.Invoke();
     44             }
     45             catch (Exception ex)
     46             {
     47                 Success = false;
     48                 ErrorMessage = string.Format("对象实例化异常:{0}->{1}", ex.Message, ex.StackTrace);
     49             }
     50             return objList;
     51         }
     52 
     53         /// <summary>
     54         /// 使用DataSet实例化对象
     55         /// </summary>
     56         /// <typeparam name="T"></typeparam>
     57         /// <param name="ds"></param>
     58         /// <returns></returns>
     59         public T CreateObjectByDataSet<T>(DataSet ds) where T : class, new()
     60         {
     61             return Invoke(() =>
     62             {
     63                 T obj = default(T);
     64                 Type _type = typeof(T);
     65                 if (ds.Equals(null))
     66                 {
     67                     return obj;
     68                 }
     69                 PropertyInfo[] propertys = _type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
     70                 ConstructorInfo info = _type.GetConstructor(new Type[] { });
     71                 obj = (T)info.Invoke(new object[] { });
     72                 for (int i = 0; i < propertys.Length; i++)
     73                 {
     74                     PropertyInfo ProInfo = propertys[i];
     75                     if (ds.Tables[0].Columns.IndexOf(ProInfo.Name) != -1 && !obj.Equals(null))
     76                     {
     77                         ProInfo.SetValue(obj, ds.Tables[0].Rows[0][ProInfo.Name]);
     78                     }
     79                 }
     80                 return obj;
     81             });
     82         }
     83 
     84         /// <summary>
     85         /// 使用DataSet实例化对象列表
     86         /// </summary>
     87         /// <typeparam name="T"></typeparam>
     88         /// <param name="ds"></param>
     89         /// <returns></returns>
     90         public List<T> CreateObjectsByDataSet<T>(DataSet ds) where T : class, new()
     91         {
     92             return Invoke(() =>
     93             {
     94                 List<T> objList = new List<T>();
     95                 Type _type = typeof(T);
     96                 if (ds.Equals(null))
     97                 {
     98                     return objList;
     99                 }
    100                 PropertyInfo[] ProInfos = _type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
    101                 for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
    102                 {
    103                     ConstructorInfo ConstInfo = _type.GetConstructor(new Type[] { });
    104                     T obj = (T)ConstInfo.Invoke(new object[] { });
    105                     for (int j = 0; j < ProInfos.Length; j++)
    106                     {
    107                         PropertyInfo ProInfo = ProInfos[j];
    108                         if (ds.Tables[0].Columns.IndexOf(ProInfo.Name) != -1 && !obj.Equals(null))
    109                         {
    110                             ProInfo.SetValue(obj, ds.Tables[0].Rows[i][ProInfo.Name]);
    111                         }
    112                     }
    113                     objList.Add(obj);
    114                 }
    115                 return objList;
    116             });
    117         }
    118 
    119 
    120         /// <summary>
    121         /// 使用DataSet根据对象构造函数实例化
    122         /// Column数量对应构造函数参数数量
    123         /// </summary>
    124         /// <typeparam name="T"></typeparam>
    125         /// <param name="ds"></param>
    126         /// <returns></returns>
    127         public T CreateObjectByConstructor<T>(DataSet ds) where T : class, new()
    128         {
    129             return Invoke(() =>
    130               {
    131                   T obj = default(T);
    132                   if (ds == null || ds.Tables.Count <= 0)
    133                   {
    134                       return obj;
    135                   }
    136                   int cLenght = ds.Tables[0].Columns.Count;
    137                   Type _type = typeof(T);
    138                   Type[] types = new Type[cLenght];
    139                   object[] objects = new object[cLenght];
    140                   for (int i = 0; i < ds.Tables[0].Columns.Count; i++)
    141                   {
    142                       types[i] = ds.Tables[0].Rows[0][i].GetType();
    143                       objects[i] = ds.Tables[0].Rows[0][i];
    144                   }
    145                   ConstructorInfo ConstInfo = _type.GetConstructor(types);
    146                   obj = (T)ConstInfo.Invoke(objects);
    147                   return obj;
    148               });
    149         }
    150 
    151         /// <summary>
    152         /// 使用DataSet根据对象构造函数实例化
    153         /// Column数量对应构造函数参数数量
    154         /// </summary>
    155         /// <typeparam name="T"></typeparam>
    156         /// <param name="arges"></param>
    157         /// <returns></returns>
    158         public List<T> CreateObjectsByConstructor<T>(DataSet arges) where T : class, new()
    159         {
    160             return Invoke(() =>
    161             {
    162                 List<T> list = new List<T>();
    163                 Type t = typeof(T); //获取类型?
    164                 if (arges.Equals(null))  //几列代表几个字段
    165                 {
    166                     return list;
    167                 }
    168                 int cLenght = arges.Tables[0].Columns.Count, rLenght = arges.Tables[0].Rows.Count;
    169                 Type[] types = new Type[cLenght]; //反射对象的类型集合
    170                 object[] param = new object[cLenght]; //反射对象的数据集合
    171                 for (int i = 0; i < rLenght; i++)
    172                 {
    173                     for (int j = 0; j < cLenght; j++)
    174                     {
    175                         types[j] = arges.Tables[0].Rows[i][j].GetType();
    176                         param[j] = arges.Tables[0].Rows[i][j];
    177                     }
    178                     ConstructorInfo info = t.GetConstructor(types);
    179                     if (info != null)
    180                     {
    181                         list.Add((T)info.Invoke(param));
    182                     }
    183                     else
    184                     {
    185                         list.Add((T)Activator.CreateInstance(t, null));
    186                     }
    187                 }
    188                 return list;
    189             });
    190         }
    191 
    192 
    193         /// <summary>
    194         /// 使用object[]实例化对象
    195         /// </summary>
    196         /// <typeparam name="T"></typeparam>
    197         /// <param name="arges"></param>
    198         /// <returns></returns>
    199         public T CreateObjectsByParams<T>(params object[] arges) where T : class, new()
    200         {
    201             return Invoke(() =>
    202             {
    203                 T obj = default(T);
    204                 Type t = typeof(T); //获取类型?
    205                 if (arges.Equals(null))
    206                 {
    207                     return obj;
    208                 }
    209                 int lenght = arges.Length;
    210                 Type[] types = new Type[lenght]; //类型集合?
    211                 object[] param = new object[lenght]; //数据集合? 对象集合?
    212                 for (int i = 0; i < lenght; i++)
    213                 {
    214                     types[i] = arges[i].GetType(); //添加类型?
    215                     param[i] = arges[i]; //添加对象?上面为获取类型,这里为数据?数据的格式是什么?失去了类型数据会以什么样的形式表现?
    216                 }
    217                 ConstructorInfo info = t.GetConstructor(types); //获取类型集合里面所有的类型?
    218                 if (info != null)
    219                 {
    220                     obj = (T)info.Invoke(param);
    221                 }
    222                 else
    223                 {
    224                     obj = (T)Activator.CreateInstance(t, null);
    225                 }
    226                 return obj;
    227             });
    228         }
    229     }
    230 }
    View Code
  • 相关阅读:
    [转载]解析.Net框架下的XML编程技术
    Intercept and Manage Windows Originated by Thirdparty Components Hosted in C# Application
    [创业]<高效能人士的七个习惯>有感
    [关于DES程序]对前DES1.0源码bug的修正
    The secret benefit of search engine optimisation: Increased usability
    效率不高的7个原因
    [PDF]Intrusion Detection Techniques and Approaches
    [转载]基于数据挖掘的入侵检测系统
    [转载]在 C# 中加载自己编写的动态链接库
    [转载]在WinForm中使用Web Services 来实现 软件 自动升级( Auto Update ) (C#)
  • 原文地址:https://www.cnblogs.com/Z-onee/p/8136921.html
Copyright © 2011-2022 走看看