NET基础学习笔记11---反射

反射

反射:就是动态获取程序集中的元数据来操作类型的。

 

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Reflection;
 6 
 7 namespace 反射的应用获取dll
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             #region 1加载指定的程序集,并获取该程序集中的所以的类型
14             //Assembly asm = Assembly.LoadFrom("TestReflect.dll");
15             //Type[] types = asm.GetTypes();
16             //foreach (Type typeitem in types)
17             //{
18             //    Console.WriteLine(typeitem.Name);
19             //}
20             //Console.WriteLine("---------------------------------------------------------------");
21             //Type[] types2 = asm.GetExportedTypes();
22             //foreach (Type type2item in types2)
23             //{
24             //    Console.WriteLine(type2item.Name);
25             //}
26             #endregion
27 
28             #region 2获取加载程序集,获取Class1下的所以的方法
29             //Assembly asb = Assembly.LoadFrom("TestReflect.dll");
30             //Type classtype = asb.GetType("TestReflect.Class1");
31 
32             //MethodInfo[] Methods= classtype.GetMethods();
33             //foreach (MethodInfo Methoditem in Methods)
34             //{
35             //    Console.WriteLine(Methoditem.Name);
36             //}
37             #endregion
38 
39             #region 3获取加载程序集,调用Class1下的所以的方法
40             Assembly asb = Assembly.LoadFrom("TestReflect.dll");
41             Type classtype = asb.GetType("TestReflect.Class1");
42             object obj = Activator.CreateInstance(classtype);
43 
44             MethodInfo Methods = classtype.GetMethod("getName");
45             Console.WriteLine(Methods.Invoke(obj, new object[] { "小庄" })); 
46             
47             #endregion
48 
49             Console.ReadKey();
50         }
51     }
52 }
View Code

1.获取程序集

Assembly asm=Assembly.LoadFrom("路径");

asm.GetTypes();获取程序集里面的所以类型。

asm.GetExportedTypes();获取程序集里面的所以公有类型。

Type classtype = asm.GetType("命名空间.类型名称")获取指定的类型。

classtype.GetMethods();获取类型里面的所以方法。

object obj=Activator.CreateInstance(classtype);创建这个类型的对象。

MethodInfo Methods=classtype.GetMethod("方法名称");获得类型里面的方法。

Methods.Invoke(obj,new object[]{});调用方法。传入类型和参数数组。

 

调用Private里面的方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace _1调用private方法
{
    class Program
    {
        static void Main(string[] args)
        {
            Type PersonType = typeof(Person);
            object obj = Activator.CreateInstance(PersonType);
            //调用private成员要添加BindingFlags.NonPublic | BindingFlags.Instance 不然会获取不到方法。
            MethodInfo info = PersonType.GetMethod("SayHi",BindingFlags.NonPublic|BindingFlags.Instance);
            info.Invoke(obj, null);
            Console.ReadKey();
        }
    }

    public class Person
    {
        private void SayHi()
        {
            Console.WriteLine("hi");
        }
    }
}
调用private方法

 

扩展方法的使用(一般不建议使用)

扩展方法的步骤:

1.创建静态类。

2.创建静态方法。

3.产生关联,

如:Public bool IsEmail(this string msg)

第一个参数,代表这个方法产生关联

第二个参数,关联对象,就是一个类型(string),msg是实体。

 

posted @ 2013-10-11 02:01  偏执的放纵  阅读(181)  评论(0编辑  收藏  举报