一、MSDN上面找的学习资料

反射提供了封装程序集、模块和类型的对象(Type 类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。

反射通常具有以下用途:

·   使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。

·   使用 Module 了解如下的类似信息:包含模块的程序集以及模块中的类等。您还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。

·   使用 ConstructorInfo 了解以下信息:构造函数的名称、参数、访问修饰符(如 public private)和实现详细信息(如 abstract virtual)等。使用 Type GetConstructors GetConstructor 方法来调用特定的构造函数。

·   使用 MethodInfo 了解以下信息:方法的名称、返回类型、参数、访问修饰符(如 public private)和实现详细信息(如 abstract virtual)等。使用 Type GetMethods GetMethod 方法来调用特定的方法。

·   使用 FieldInfo 了解以下信息:字段的名称、访问修饰符(如 public private)和实现详细信息(如 static)等;并获取或设置字段值。

·   使用 EventInfo 来了解如下的类似信息:事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等;并添加或移除事件处理程序。

·   使用 PropertyInfo 来了解如下的类似信息:属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。

·   使用 ParameterInfo 来了解如下的类似信息:参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置等。

·   当您在一个应用程序域的仅反射上下文中工作时,请使用 CustomAttributeData 来了解有关自定义属性的信息。使用 CustomAttributeData,您不必创建属性的实例就可以检查它们。

二、反射的重要应用与相关练习

反射在下列情况下很有用:

·   需要访问程序元数据的属性。

C# 具有一个反射系统,可用来检索用自定义属性定义的信息。主要方法是 GetCustomAttributes,它返回对象数组,这些对象在运行时等效于源代码属性。

下面是我参照MSDN写的一个例子:定义一个自定义属性,将其应用于若干实体并通过反射进行检索。

 1[原]反射学习整理using System;
 2[原]反射学习整理using System.Collections.Generic;
 3[原]反射学习整理using System.Text;
 4[原]反射学习整理
 5[原]反射学习整理namespace Attribut
 6[原]反射学习整理[原]反射学习整理[原]反射学习整理{
 7[原]反射学习整理    //允许指定多个属性实例,类YaoJian中进行了练习
 8[原]反射学习整理    [AttributeUsage(AttributeTargets.Class,AllowMultiple = true)]
 9[原]反射学习整理    public class Students:Attribute
10[原]反射学习整理[原]反射学习整理    [原]反射学习整理{
11[原]反射学习整理        string name;
12[原]反射学习整理        public int age;
13[原]反射学习整理        
14[原]反射学习整理        public Students(string Name)
15[原]反射学习整理[原]反射学习整理        [原]反射学习整理{
16[原]反射学习整理            name = Name;
17[原]反射学习整理            age = 18;
18[原]反射学习整理        }

19[原]反射学习整理
20[原]反射学习整理        public string GetName()
21[原]反射学习整理[原]反射学习整理        [原]反射学习整理{
22[原]反射学习整理            return name;
23[原]反射学习整理        }

24[原]反射学习整理    }

25[原]反射学习整理    //将自定义属性应用于类
26[原]反射学习整理    [Students("李江")]
27[原]反射学习整理    class LiJiang
28[原]反射学习整理[原]反射学习整理    [原]反射学习整理{
29[原]反射学习整理        //[原]反射学习整理[原]反射学习整理
30[原]反射学习整理    }

31[原]反射学习整理
32[原]反射学习整理    //不定义Students属性
33[原]反射学习整理    class ZhaoYong
34[原]反射学习整理[原]反射学习整理    [原]反射学习整理{
35[原]反射学习整理        //[原]反射学习整理[原]反射学习整理
36[原]反射学习整理    }

37[原]反射学习整理    //应用多个属性实例
38[原]反射学习整理    [Students("姚键"),Students("李云",age = 20)]
39[原]反射学习整理    class YaoJian
40[原]反射学习整理[原]反射学习整理    [原]反射学习整理{
41[原]反射学习整理        //[原]反射学习整理[原]反射学习整理
42[原]反射学习整理    }

43[原]反射学习整理    class Program
44[原]反射学习整理[原]反射学习整理    [原]反射学习整理{
45[原]反射学习整理        static void Main(string[] args)
46[原]反射学习整理[原]反射学习整理        [原]反射学习整理{
47[原]反射学习整理            StudentsInfo(typeof(LiJiang));
48[原]反射学习整理            StudentsInfo(typeof(ZhaoYong));
49[原]反射学习整理            StudentsInfo(typeof(YaoJian));
50[原]反射学习整理        }

51[原]反射学习整理
52[原]反射学习整理        private static void StudentsInfo(Type t)
53[原]反射学习整理[原]反射学习整理        [原]反射学习整理{
54[原]反射学习整理            Console.WriteLine("学生信息是:{0}",t);
55[原]反射学习整理            //获取对象中的自定义属性
56[原]反射学习整理            Attribute[] att = Attribute.GetCustomAttributes(t);
57[原]反射学习整理            foreach (Attribute a in att)
58[原]反射学习整理[原]反射学习整理            [原]反射学习整理{
59[原]反射学习整理                if (a is Students)
60[原]反射学习整理[原]反射学习整理                [原]反射学习整理{
61[原]反射学习整理                    Students S = (Students)a;
62[原]反射学习整理                    Console.WriteLine("学生的姓名是:{0},年龄是:{1}",S.GetName(),S.age.ToString());
63[原]反射学习整理                }

64[原]反射学习整理            }

65[原]反射学习整理        }

66[原]反射学习整理    }

67[原]反射学习整理}

68[原]反射学习整理
运行结果是:
[原]反射学习整理
 

·   检查和实例化程序集中的类型。

·   在运行时构建新类型。使用 System.Reflection.Emit

中的类。

·   执行后期绑定,访问在运行时创建的类型的方法。

三、实践,用反射调用COM

用反射调用COM非常的方便,不需要先对COM进行注册添加引用,用Assembly类中的LoadFrom方法直接可以讲.dll文件加载到程序中,然后对其实例化使用。

实例:

1、先做一个简单的调用系统outlookCOM

先在VS2005中建一个windows控件库工程,取名为Send,然后把控件的界面删掉,在Send工程中添加一个windows窗体也取名为Send,在窗体的load事件里面写代码调用outlook。完整的代码如下:
 1[原]反射学习整理using System;
 2[原]反射学习整理using System.Collections.Generic;
 3[原]反射学习整理using System.ComponentModel;
 4[原]反射学习整理using System.Data;
 5[原]反射学习整理using System.Drawing;
 6[原]反射学习整理using System.Text;
 7[原]反射学习整理using System.Windows.Forms;
 8[原]反射学习整理
 9[原]反射学习整理//使用进程引用命名空间
10[原]反射学习整理using System.Diagnostics;
11[原]反射学习整理namespace Send
12[原]反射学习整理[原]反射学习整理[原]反射学习整理{
13[原]反射学习整理    public partial class Send : Form
14[原]反射学习整理[原]反射学习整理    [原]反射学习整理{
15[原]反射学习整理        public Send()
16[原]反射学习整理[原]反射学习整理        [原]反射学习整理{
17[原]反射学习整理            InitializeComponent();
18[原]反射学习整理        }

19[原]反射学习整理[原]反射学习整理        /**//// <summary>
20[原]反射学习整理        /// 在Form_Load中调用Windows带的outlook
21[原]反射学习整理        /// </summary>
22[原]反射学习整理        /// <param name="sender"></param>
23[原]反射学习整理        /// <param name="e"></param>

24[原]反射学习整理        private void Send_Load(object sender, EventArgs e)
25[原]反射学习整理[原]反射学习整理        [原]反射学习整理{
26[原]反射学习整理            Process P = new Process();
27[原]反射学习整理            P.StartInfo.FileName = "C:\\Program Files\\Outlook Express\\msimn.exe";
28[原]反射学习整理            P.Start();
29[原]反射学习整理            this.Close();
30[原]反射学习整理        }

31[原]反射学习整理    }

32[原]反射学习整理}

33[原]反射学习整理

代码写完以后,生成一下,这时在工程的bin文件夹下面就生成了一个Send.dll的文件。

2、用反射来调用上面的COM

Send工程的解决方案上面点击右键添加/新建项目/windows应用程序,取名FansheForm1上面添加一个button,并设置其相关属性,界面如图:
[原]反射学习整理
把上面生成的Send.dll放到Fanshebin目录下面,在buttonclick事件中添加代码调用COM,完整代码如下:

 1[原]反射学习整理using System;
 2[原]反射学习整理using System.Collections.Generic;
 3[原]反射学习整理using System.ComponentModel;
 4[原]反射学习整理using System.Data;
 5[原]反射学习整理using System.Drawing;
 6[原]反射学习整理using System.Text;
 7[原]反射学习整理using System.Windows.Forms;
 8[原]反射学习整理
 9[原]反射学习整理//使用反射引用的命名空间
10[原]反射学习整理using System.Reflection;
11[原]反射学习整理
12[原]反射学习整理namespace Fanshe
13[原]反射学习整理[原]反射学习整理[原]反射学习整理{
14[原]反射学习整理    public partial class frm : Form
15[原]反射学习整理[原]反射学习整理    [原]反射学习整理{
16[原]反射学习整理        public frm()
17[原]反射学习整理[原]反射学习整理        [原]反射学习整理{
18[原]反射学习整理            InitializeComponent();
19[原]反射学习整理        }

20[原]反射学习整理
21[原]反射学习整理        private void btn_Click(object sender, EventArgs e)
22[原]反射学习整理[原]反射学习整理        [原]反射学习整理{
23[原]反射学习整理[原]反射学习整理            /**//*加载COM,这样写COM的默认路径在bin文件夹下,如果不在可以通过绝对路径或者相对路径指到COM所在的位置
24[原]反射学习整理             *比如:Assembly.LoadFrom("D://App//Send.dll")或Assembly.LoadFrom(".//Send.dll")
25[原]反射学习整理             */

26[原]反射学习整理            Assembly A = Assembly.LoadFrom("Send.dll");
27[原]反射学习整理            //注意参数中,第一个Send是COM中要实例化类的命名空间名,第二个Send是类名
28[原]反射学习整理            Object O = A.CreateInstance("Send.Send");
29[原]反射学习整理            Form F = (Form)O;
30[原]反射学习整理            F.Show();
31[原]反射学习整理        }

32[原]反射学习整理    }

33[原]反射学习整理}

34[原]反射学习整理

代码完成后,将Fanshe设为启动项并运行,点击button,调出outlook,界面如下:
[原]反射学习整理
 

这个简单的例子就完成了,里面使用了反射的很少一部分内容,但也可以帮助理解反射机制。

 四、反射的应用要点

1.现实应用程序中很少有应用程序需要使用反射类型 

2.使用反射动态绑定需要牺牲性能 

反射的性能损失主要来源于比较类型、遍历成员、调用成员三种情形,其中比较类型耗时最小,调用成员耗时最多,所以尽量减少采用成员动态调用等反射方式可以提高应用程序性能。除此之外,采取后期绑定、避免将反射方法放到循环内产生放大效应等办法均可提升反射性能。

3.有些元数据信息是不能通过反射获取的 

某些反射类型是专门为那些clr 开发编译器的开发使用的,所以你要意识到不是所有的反射类型都是适合每个人的。

 程序下载:反射掉COM实例

转载于:https://www.cnblogs.com/salonliudong/archive/2007/10/10/919719.html

相关文章:

  • 2021-05-14
  • 2021-09-25
  • 2021-11-27
  • 2021-12-06
  • 2021-12-25
  • 2022-02-02
  • 2022-12-23
猜你喜欢
  • 2021-09-29
  • 2021-12-05
  • 2022-12-23
  • 2022-01-06
  • 2021-12-06
相关资源
相似解决方案