.Net反射在项目中的应用

案例1:项目中可能有多个DAL程序集,每个程序集使用不同的持久化技术或对应不同类型的数据库,但是它们使用同一套接口。

可以在配置文件中配置DAL程序集名称,使用反射加载程序集、创建dal对象。

这样做的好处是使用接口解耦BLL、DAL,如果需要更换其他技术的DAL,只需要修改配置文件中程序集名称即可

 1 /// 
 2     /// 数据层工厂
 3     /// 
 4     public class DALFactory
 5     {
 6         /// 
 7         /// 通过反射机制,实例化接口对象
 8         /// 
 9         private static readonly string _path = System.Configuration.ConfigurationManager.AppSettings["ShopCartMySqlDAL"];
10         private static readonly Assembly _Assembly = Assembly.Load(DALFactory._path);
11 
12         /// 
13         /// 通过反射机制,实例化Base_country_culturepart接口对象
14         /// 
15         ///Base_country_culturepart接口对象
16         public static IPersonDAL PersonInstance()
17         {
18             return (IPersonDAL)_Assembly.CreateInstance(DALFactory._path + ".PersonDAL");
19         }
20 
21 //省略其他DAL对象创建
22 }
    public class PersonBLL
    {
        private static readonly IPersonDAL _dal = DALFactory.PersonInstance();
public static Person Select(IDataReader dr)
        {
            return PersonBLL._dal.Select(dr);    
        }    
}
//省略其他BLL

 案例2:两个属性大体相同的对象,通过反射进行赋值。

 1 /// 
 2         /// 将一种类型的对象向另一种类型的对象通过相同属性名称的所有属性进行赋值操作
 3         /// 只有SQLServer里面的实体类可以使用,因为SQLServer中有Boolean类型,需要将Int32专成Boolean
 4         /// 
 5         /// 源类型
 6         /// 目标类型
 7         /// 源对象
 8         /// 目标对象
 9         public static void SetPropertyInfoSQLServer(S source, D desc)
10         {
11             PropertyInfo[] propertyInfoSources = typeof(S).GetProperties();
12             PropertyInfo[] propertyInfoDescs = typeof(D).GetProperties();
13             if (propertyInfoSources != null && propertyInfoSources.Length > 0)
14             {
15                 foreach (PropertyInfo propertyInfoSource in propertyInfoSources)
16                 {
17                     foreach (PropertyInfo propertyInfoDesc in propertyInfoDescs)
18                     {
19                         if (string.Compare(propertyInfoSource.Name, propertyInfoDesc.Name, true) == 0)
20                         {
21                             object sourceValue = propertyInfoSource.GetValue(source, null);
22                             object descValue = propertyInfoDesc.GetValue(desc, null);
23                             if ((sourceValue == null && descValue != null)
24                                 || (sourceValue != null && descValue == null))
25                             {
26                                 try
27                                 {
28                                     if (sourceValue.GetType() == typeof(Boolean))
29                                     {
30                                         propertyInfoDesc.SetValue(desc, TypeParseHelper.StrToInt32(sourceValue) == 1 ? true : false, null);
31                                     }
32                                     else
33                                     {
34                                         propertyInfoDesc.SetValue(desc, sourceValue, null);
35                                     }
36                                 }
37                                 catch (Exception)
38                                 { }
39                             }
40                             else if (sourceValue != null && descValue != null && !sourceValue.Equals(descValue))
41                             {
42                                 try
43                                 {
44                                     if (sourceValue.GetType() == typeof(Boolean))
45                                     {
46                                         propertyInfoDesc.SetValue(desc, TypeParseHelper.StrToInt32(sourceValue) == 1 ? true : false, null);
47                                     }
48                                     else
49                                     {
50                                         propertyInfoDesc.SetValue(desc, sourceValue, null);
51                                     }
52                                 }
53                                 catch (Exception)
54                                 { }
55                             }
56                             break;
57                         }
58                     }
59                 }
60                 Array.Clear(propertyInfoSources, 0, propertyInfoSources.Length);
61                 propertyInfoSources = null;
62                 Array.Clear(propertyInfoDescs, 0, propertyInfoDescs.Length);
63                 propertyInfoDescs = null;
64             }
65         }

 

你可能感兴趣的:(.Net反射在项目中的应用)