反射相关

 

有时候,为了快速批量处理已经实现某个基类或者某个接口的子类,需要通过反射的方式获取到他们的类类型(Type),然后再通过

view source
print ?
1 Activator.CreateInstance(objType);

或者

view source
print ?
1 Assembly.Load(path).CreateInstance(typeName);

或者

view source
print ?
1 Assembly.LoadFile(filePath).CreateInstance(typeName);

创建对象实例。

以下通过一个简单的示例来展示:
1,获取当前程序集中的全部类型;
2,判断某一类型是否是继承与另一类型;
3,根据类型名动态创建对象。

目前还有个疑问,不知道谁能解答:
1,如何判断某个类是否实现了某个接口,目前只能先 new 一个对象,然后再 用 is 判断。

view source
print ?
001 using System;
002 using System.Collections.Generic;
003 using System.Text;
004 using System.Reflection;
005 using System.Diagnostics;
006   
007 namespace com.hetaoos
008 {
009   
010     class Test
011     {
012         public Test()
013         {
014             var types = Assembly.GetExecutingAssembly().GetTypes();
015             var baseType = typeof(BaseProcessor);
016             List<BaseProcessor> processors = new List<BaseProcessor>();
017             foreach (var t in types)
018             {
019                 var tmp = t.BaseType;
020                 while (tmp != null)
021                 {
022                     if (tmp == baseType)
023                     {
024                         BaseProcessor obj = MethodMaker.CreateObject(t.FullName) as BaseProcessor;
025                         if (obj != null)
026                         {
027                             processors.Add(obj);
028                         }
029                         break;
030                     }
031                     else
032                     {
033                         tmp = tmp.BaseType;
034                     }
035                 }
036             }
037   
038             Debug.Print("Processor Count:{0}", processors.Count);
039             foreach (var p in processors)
040             {
041                 Debug.Print("{0}\t:{1}", p, p.Calc(2, 5));
042             }
043         }
044     }
045   
046     public class MethodMaker
047     {
048   
049         /// <summary>
050         /// 创建对象(当前程序集)
051         /// </summary>
052         /// <param name="typeName">类型名</param>
053         /// <returns>创建的对象,失败返回 null</returns>
054         public static object CreateObject(string typeName)
055         {
056             object obj = null;
057             try
058             {
059                 Type objType = Type.GetType(typeName, true);
060                 obj = Activator.CreateInstance(objType);
061             }
062             catch (Exception ex)
063             {
064                 Debug.Write(ex);
065             }
066             return obj;
067         }
068   
069         /// <summary>
070         /// 创建对象(外部程序集)
071         /// </summary>
072         /// <param name="path"></param>
073         /// <param name="typeName">类型名</param>
074         /// <returns>创建的对象,失败返回 null</returns>
075         public static object CreateObject(string path, string typeName)
076         {
077             object obj = null;
078             try
079             {
080   
081                 obj = Assembly.Load(path).CreateInstance(typeName);
082             }
083             catch (Exception ex)
084             {
085                 Debug.Write(ex);
086             }
087   
088             return obj;
089         }
090     }
091   
092     public abstract class BaseProcessor
093     {
094         public abstract int Calc(int a, int b);
095     }
096   
097     public class Adder : BaseProcessor
098     {
099         public override int Calc(int a, int b)
100         {
101             return a + b;
102         }
103     }
104   
105     public class Multiplier : BaseProcessor
106     {
107         public override int Calc(int a, int b)
108         {
109             return a * b;
110         }
111     }
112 }

输出结果为:

view source
print ?
1 Processor Count:2
2 com.hetaoos.Adder   :7
3 com.hetaoos.Multiplier  :10

PS:
判断某个类是否继承自某个接口、类的方法:

view source
print ?
01 public static bool IsParent(Type test, Type parent)
02 {
03     if (test == null || parent == null || test == parent || test.BaseType == null)
04     {
05         return false;
06     }
07     if (parent.IsInterface)
08     {
09         foreach (var t in test.GetInterfaces())
10         {
11             if (t == parent)
12             {
13                 return true;
14             }
15         }
16     }
17     else
18     {
19         do
20         {
21             if (test.BaseType == parent)
22             {
23                 return true;
24             }
25             test = test.BaseType;
26         } while (test != null);
27     }
28     return false;
29 }

你可能感兴趣的:(exception,null,System,Path,Types)