接着上一章的内容讲.回顾一下,上一章主要讲了特性的定义,创建自定义特性,本章说一下如何获得元数据并在程序中使用它.
利用反射可以让自定义特性的功能发挥作用.
反射通常被用在4种任务
(1)查看元数据
(2)执行类型发现功能
(3)延迟绑定到方法和属性上
(4)在运行机制时创建类型
一:查看元数据
接着上一章的自定义特性代码进行进一步应用.先上代码
1 MyMath mm = new MyMath(); 2 Console.WriteLine(mm.DoFun1(2)); 3 4 5 6 //获取成员信息,并使用它获取自定义特性 7 MemberInfo myMemberInfo = typeof(MyMath); 8 object[] myobject = myMemberInfo.GetCustomAttributes(typeof(BugFixAttribute), false); 9 10 //获得特性信息 11 foreach (object att in myobject) 12 { 13 BugFixAttribute bug = (BugFixAttribute)att; 14 Console.WriteLine("BugId : {0}", bug.BugId); 15 Console.WriteLine("Date : {0}", bug.Date); 16 Console.WriteLine("programer : {0}", bug.programer); 17 Console.WriteLine("commer : {0}", bug.commer); 18 19 } 20 21 Console.ReadKey();
代码我已经加了注释.主要是MemberInfo和GetCustomerAttributes
MemberInfo:用于发现类型的特性,并提供访问元数据的方法
GetCustomerAttributes ,查找你希望的类型,它返回的是一个数组.数组中的每一项都你希望的类型.
二:类型发现
还是直接上代码
首先建立一个类库,我叫Test,并建立一个类AssemblyTest.cs,这个类的代码如下:
1 public class AssemblyTest 2 { 3 private int _Id; 4 5 public int Id 6 { 7 get { return _Id; } 8 set { _Id = value; } 9 } 10 11 private string GetStr(string str) 12 { 13 return str; 14 } 15 public int Add(int a, int b) 16 { 17 return a + b; 18 } 19 public int Instr(int a, int b) 20 { 21 return a - b; 22 } 23 public int Cheng(int a, int b) 24 { 25 return a * b; 26 } 27 public int Chu(int a, int b) 28 { 29 return a / b; 30 } 31 32 }
再另建立一个测试程序,代码如下:
1 Assembly asm = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + "\\Test.dll"); 2 Type theType = asm.GetType("Test.AssemblyTest"); 3 4 object oInst = Activator.CreateInstance(theType); 5 MethodInfo infos = theType.GetMethod("Add"); 6 7 object[] parm = new object[2]; 8 parm[0] = 10; 9 parm[1] = 2; 10 11 object t=infos.Invoke(oInst, parm); 12 13 Console.WriteLine("{0}",t.ToString()); 14 Console.ReadKey();
以上代码讲了以反射的形式访问程序集,并动态调用类内部方法.
三 动态调用方法
1 static void tests() 2 { 3 Type theMathType = Type.GetType("System.Math"); 4 5 Type[] paramTypes = new Type[1]; 6 paramTypes[0] = Type.GetType("System.Double"); 7 8 MethodInfo CosineInfo = theMathType.GetMethod("Cos", paramTypes); 9 10 object[] parameters = new object[1]; 11 parameters[0] = 45 * (Math.PI / 180); 12 13 object returnVal = CosineInfo.Invoke(theMathType, parameters); 14 15 Console.Write(returnVal); 16 17 }
只调用一个方法需要做大量的工作,不过,这种做法的威力在于你可以使用反射功能来发现用户机器上的程序集,并查询可用的方法,然后动态调用其中的成员之一.
转载的请注原创地址,谢谢。