• NBear实例讲解


    Nbear的接口主要是调用ObjectConvertor类的3大类方法:ToObject,ToList,ToDataTable。

    主要功能:不同类型的对象可以通过类型属性的映射,进行转换,包括类与接口。对于两种类型毫无继承关系,且两种类型的数据需要转换时,Nbear是很有用的。

    另外Nbear是开源代码,在类型转换的过程中,主要使用 System.Reflection.Emit;反射来取值并赋值到新对象。使用IL编程一定程度上提高了程序的效率。

    要研究IL的网友,可以认真研究一下其源码。

    数据模型
     1   public interface IUser
     2     {
     3 
     4         string Name
     5         {
     6             get;
     7             set;
     8         }
     9 
    10         int Age
    11         {
    12             get;
    13             set;
    14         }
    15 
    16     }
    17 
    18     public class User : IUser
    19     {
    20         //需要无参数构造函数
    21         public User()
    22         {
    23         }
    24         public User(string name, int age, bool isvisible)
    25         {
    26             this.Name=name;
    27             this.Age=age;
    28             this.IsVisible=isvisible;
    29         }
    30 
    31         public string Name
    32         {
    33             get;
    34             set;
    35         }
    36 
    37         public int Age
    38         {
    39             get;
    40             set;
    41         }
    42         public bool IsVisible
    43         {
    44             get;
    45             set;
    46         }
    47 
    48     }
      1    using NBear.Mapping;
      2     using NBearLiteDemo.Model;
      3     class Program
      4     {
      5         //ObjectConvertor类:: ToObject;ToList;ToDataTable
      6         static void Main(string[] args)
      7         {
      8          
      9            
     10             User user=new User("Jefftary", 24, true);
     11             User[] users=new User[] { user,new User("Jackbaby",19,true)};
     12           
     13             User outputObject1 = ObjectConvertor.ToObject<User>(user);            
     14             User outputObject2 = ObjectConvertor.ToObject<IUser, User>(user);   
     15           
     16             //User-Others
     17             DataRow outputObject3 = ObjectConvertor.ToObject<DataRow>(user);                   
     18             Hashtable outputObject4 = ObjectConvertor.ToObject<Hashtable>(user);                
     19             NameValueCollection outputObject5 = ObjectConvertor.ToObject<NameValueCollection>(user);                
     20             Dictionary<string, object> outputObject6 = ObjectConvertor.ToObject<Dictionary<string, object>>(user);               
     21               
     22             //Others->User
     23             User outputObject31 = ObjectConvertor.ToObject<User>(outputObject3);
     24             User outputObject41 = ObjectConvertor.ToObject<User>(outputObject4);
     25             User outputObject51 = ObjectConvertor.ToObject<User>(outputObject5);     
     26             User outputObject61 = ObjectConvertor.ToObject<User>(outputObject5);
     27 
     28             object[] list=new object[] { outputObject1, outputObject2, outputObject3, outputObject4, outputObject5, outputObject6 };
     29             object[] list2=new object[] { outputObject31, outputObject41, outputObject51, outputObject61 };
     30 
     31              //Array->List<User>
     32             List<User> userList = ObjectConvertor.ToList<IUser, User>(users);
     33 
     34              //Array->DataTable->List<User>->DataTable
     35             DataTable userTable = ObjectConvertor.ToDataTable(users, typeof(User));
     36             List<User> userList1 = ObjectConvertor.ToList<DataRow, User>(userTable);
     37             List<User> userList2 = ObjectConvertor.ToList<IDataReader, User>(userTable);
     38             DataTable  userTable2=ObjectConvertor.ToDataTable(userList, typeof(User));
     39              
     40 
     41             ShowList(list,"[Object]",true);
     42             ShowList(list2, "[Object-Parse]", true);
     43 
     44             ShowList(users, "[Array]");
     45 
     46             ShowList(userTable, "[ToDataTable(users, typeof(User))]");
     47             ShowList(userList, "[ToList<IUser, User>(users)]");
     48            
     49             ShowList(userList1, "[ToList<DataRow, User>(userTable)]");
     50             ShowList(userList2, "[ToList<IDataReader, User>(userTable)]");            
     51             ShowList(userTable2, "[ToDataTable(userList, typeof(User))]");
     52        
     53 
     54             var th=Type.GetTypeHandle(3);
     55             
     56             Console.WriteLine(th);
     57             Console.ReadKey();
     58         }
     59         
     60         static void Show(object obj,bool showType=true)
     61         {  
     62             string printFormat="{0}:\r\n\t\t{1}\t{2}\t{3}\r\n";
     63             if(!showType)
     64                 printFormat="\trow:\t{1}\t{2}\t{3}";
     65 
     66             Type type=obj.GetType(); 
     67             if (type.Equals(typeof(User)))
     68             {
     69                 var user=obj as User;
     70                 Console.WriteLine(string.Format(printFormat, type, user.Name, user.Age, user.IsVisible));
     71             }
     72             else
     73             {   
     74                 //反射获取索引器 this[Name]
     75                 var prop = type.GetProperty("Item", new Type[] { typeof(string) });
     76                 if (prop!=null)
     77                 {
     78                     //DataRow,Hashtable,Dictionary,NameValueCollection
     79                     var name= prop.GetGetMethod().Invoke(obj, new object[] { "Name" });
     80                     var age= prop.GetGetMethod().Invoke(obj, new object[] { "Age" });
     81                     var visible= prop.GetGetMethod().Invoke(obj, new object[] { "IsVisible" });
     82                     Console.WriteLine("this[Name]:");
     83                     Console.WriteLine(string.Format(printFormat, type, name, age, visible));
     84                 }
     85             }
     86             
     87             //else if (type.Equals(typeof(NameValueCollection)))
     88             //{
     89             //    var nv=obj as NameValueCollection;
     90 
     91             //    Console.WriteLine(string.Format(printFormat, type, nv["Name"], nv["Age"], nv["IsVisible"]));
     92             //}
     93             //else if (type.Equals(typeof(DataRow)))
     94             //{
     95             //    var dr=obj as DataRow;
     96             //    Console.WriteLine(string.Format(printFormat, type, dr["Name"].ToString(), dr["Age"].ToString(), dr["IsVisible"].ToString()));
     97 
     98             //}
     99             //else if (typeof(IDataReader).IsAssignableFrom(type))
    100             //{
    101             //    var rd=obj as IDataReader;
    102             //    Console.WriteLine(string.Format(printFormat, type, rd["Name"].ToString(), rd["Age"].ToString(), rd["IsVisible"].ToString()));
    103 
    104             //}
    105             //else if (type.Equals(typeof(Dictionary<string, object>)))
    106             //{
    107             //    var dc=obj as Dictionary<string, object>;
    108             //    Console.WriteLine(string.Format(printFormat, type, dc["Name"].ToString(), dc["Age"].ToString(), dc["IsVisible"].ToString()));
    109             //}
    110             //else if (type.Equals(typeof(Hashtable)))
    111             //{
    112             //    var ht=obj as Hashtable;
    113             //    Console.WriteLine(string.Format(printFormat, type, ht["Name"].ToString(), ht["Age"].ToString(), ht["IsVisible"].ToString()));
    114 
    115             //}
    116         }
    117 
    118         static void ShowList(object obj,string title="",bool showType=false)
    119         {
    120             Console.WriteLine(string.Format("----------------------------{0}------------------------",title));
    121             Type  type=obj.GetType();
    122             if (type.Equals(typeof(DataTable)))
    123             {
    124                 var tb=obj as DataTable;
    125                 //for (int i=0; i<tb.Rows.Count; i++)
    126                 //    Show(tb.Rows[i],showType);
    127                 IDataReader reader=tb.CreateDataReader();
    128                 while (reader.Read())
    129                 {
    130                     Show(reader, showType);
    131                 }            
    132 
    133 
    134             }
    135             else if(type.IsGenericType && typeof(IEnumerable<>).MakeGenericType(typeof(object)).IsAssignableFrom(type))
    136             {
    137                 var list=obj as IEnumerable<object>;
    138                 foreach (var item in list)
    139                 {
    140                     Show(item, showType);
    141                 }
    142             }
    143             else if (type.IsArray)
    144             {
    145                 var ary=obj as Array;
    146                 foreach (var item in ary)
    147                 {
    148                     Show(item,showType);
    149                 }
    150             }
    151         }
    152     
    153 
    154     }
  • 相关阅读:
    我读过的书 编程爱好者
    HarmonyOS ListContainer基础用法
    HarmonyOS ListContainer 读取网络json数组
    HarmonyOS Activity页面跳转
    HarmonyOS ListContainer 图文并排
    HarmonyOS 线性布局练习一 登录页面
    jsonserver 环境搭建及使用方法
    HarmonyOS 真机调试
    在win下设置C语言环境变量
    使用 Eclipse 调试 Java 程序的 10 个技巧
  • 原文地址:https://www.cnblogs.com/AspDotNetMVC/p/2943035.html
Copyright © 2020-2023  润新知