1.查找类型、属性、方法

在这个类中找工具—>选项—>项目和解决方案—>总是显示解决方案 然后添加一个类库在这个类中填写变量、属性、方法。

例如

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

namespace STtudent
{
    public class Class1
    {
        public void shop()
        {
            Console.WriteLine("添加程序集成功");
        }
        Public int i;
    }
}

添加成功会在Debug中出现

                        Student.dll

 

在有主函数的类中引用命名空间(using System.Reflection)然后引用—>添加引用—>项目—>Student.dll——确定

事例

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

namespace 反射一
{
    class Program
    {
        static void Main(string[] args)

      {

            //加载程序集

            Assembly.Load("Student");

            Assembly asb=Assembly.LoadFrom("Student.dll");

            //利用相对路径添加程序集

            Assembly asse = Assembly.LoadFile(@"E:\C#的基础知识\2010-01-26\反射一\Student\bin\Debug\Student.dll");

            Console.WriteLine(asse.FullName);

            //加载类

            Type pe=asb.GetType("Student.Class1");

            //打印的是空间名和类名

            Console.WriteLine(pe);

            Console.Read();

        }

    }

}

 

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

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

namespace 反射一
{
    class Program
    {
        static void Main(string[] args)
        {
            //加载程序集
            Assembly ass=Assembly.Load("Student");
            Console.WriteLine(ass.ToString());
            Assembly asb=Assembly.LoadFrom("Student.dll");
            Type pe=asb.GetType("Student.Class1");
            //Console.WriteLine(pe);
            Console.WriteLine(pe.FullName);
            FieldInfo[] fio = pe.GetFields();
            //遍历字段
            foreach (FieldInfo i in fio)
            {
                //获取此字段对像的类型 (Student.Class1)
                //Console.WriteLine(i.FieldType);
                //Console.WriteLine(i.ToString());
                Console.WriteLine(i.Name);
            }
            //指定绑定约束搜索指定成员类型的指定成员
            //MemberInfo[] mi = pe.GetMembers();
            //foreach (MemberInfo m in mi)
            //{
            //    //指定成员是一个字段
            //    if (m.MemberType == MemberTypes.Field)
            //    {
            //        Console.WriteLine(m.Name);
            //    }
            //    //指定该成员是一个方法 (get_Name是属性中的一个方法。)
            //    else if (m.MemberType == MemberTypes.Method)
            //    {
            //        Console.WriteLine(m.Name);
            //    }
            //    //指定该成员是一个属性  显示的是所有的属性
            //    else if (m.MemberType == MemberTypes.Property)
            //    {
            //        Console.WriteLine(m.Name);
            //    }
            //    else if(m.MemberType==MemberTypes.Constructor)
            //    {
            //       Console.WriteLine("构造方法有:" + m.Name);
            //      }
            //}
            Console.Read();
        }
    }
}

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

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

 

添加的类中的东西

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

namespace Student
{
    public class Class1
    {
        string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        int age;

        public int Age
        {
            get { return age; }
            set { age = value; }
        }
        string homeTown;

        public string HomeTown
        {
            get { return homeTown; }
            set { homeTown = value; }
        }
        public Class1()
        { }
        public Class1(string name, int age)
        {
            this.name = name;
            this.age = age;
        }
        public Class1(string name, int age, string hometown)
            : this(name, age)
        {
            this.homeTown = hometown;
        }
        public void Eat()
        {
            Console.WriteLine("吃饭");
        }
    }
}

2.用反射的方法创建对象,为类中的内容添值

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            #region 添加值的第一种方法
            Assembly ass = Assembly.Load("zpboy");
            Type tp = ass.GetType("zpboy.Class1");
            //CreateInstance(他的英文意思是create创建instance实例)从此程序集中查找指定的类型,并使用系统激活器创建它的实例。
            object o = ass.CreateInstance("zpboy.Class1");
            //把o类型转换成Class1类型
            zpboy.Class1 zc = o as zpboy.Class1;
            zc.Name = "张三";
            zc.Age = 15;
            zc.Eat();
            Console.WriteLine("姓名:{0} 年龄:{1}", zc.Name, zc.Age);
            #endregion

            #region 添加值的另一种方法
            Assembly ass1 = Assembly.Load("zpboy");
            Type tp1 = ass1.GetType("zpboy.Class1");
            object o1 = ass1.CreateInstance("zpboy.Class1");
            Type[] t = new Type[2];
            t[0] = typeof(string);
            t[1] = typeof(int);
            //GetConstructor搜索其参数与指定数组中的类型匹配的公共实例构造函数
            //ConstructorInfo发现构造函数属性并提供构造函数原数据的访问权。
            ConstructorInfo con = tp1.GetConstructor(t);
            con.Invoke(o1, new object[] { "小崔", 20 });
            //使用 Type 的 GetMethods 或 GetMethod 方法来调用特定的方法。
            MethodInfo m = tp1.GetMethod("Display");
            m.Invoke(o1, null);
            MethodInfo mt = tp1.GetMethod("Eat");
            mt.Invoke(o1, null);

            object j = ass1.CreateInstance("zpboy.Class1");
            Type[] ty = new Type[3];
            ty[0] = typeof(string);
            ty[1] = typeof(int);
            ty[2] = typeof(string);
            ConstructorInfo con1 = tp1.GetConstructor(ty);
            //Invoke使用指定的参数调用当前实例所表示的方法或构造函数
            con1.Invoke(j, new object[] { "王五", 15, "保定" });
            MethodInfo met = tp1.GetMethod("Show");
            met.Invoke(j, null);
            #endregion

            #region 最后添值的方法
            Assembly ass2 = Assembly.Load("zpboy");
            Type tp2 = ass2.GetType("zpboy.Class1");
            //创建对象(Activator催化剂)
            object ob = Activator.CreateInstance(tp2, new object[] { "小刘", 23, "河北" });
            //调用实际方法
            MethodInfo mti = tp2.GetMethod("Show");
            mti.Invoke(ob, null);
            #endregion
            
            #region
            Assembly ass3 = Assembly.Load("zpboy");
            Type tp3 = ass3.GetType("zpboy.Class1");
            object o3=Activator.CreateInstance(tp3,new object[]{"zhangsan",12});
            MethodInfo me1 = tp3.GetMethod("Display1");
            me1.Invoke(o3,new object[]{"学习"});

            #endregion
            Console.Read();
        }
    }
}

创建的类

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

namespace zpboy
{
    public class Class1
    {
        string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        int age;

        public int Age
        {
            get { return age; }
            set { age = value; }
        }
        string homeTown;

        public string HomeTown
        {
            get { return homeTown; }
            set { homeTown = value; }
        }
        public Class1()
        {

        }
        public Class1(string name, int age)
        {
            this.name = name;
            this.age = age;
        }
        public Class1(string name, int age, string hometown)
            : this(name, age)
        {
            this.homeTown = hometown;
        }
        public void Eat()
        {
            Console.WriteLine("吃饭");
        }
        public void Display()
        {
            Console.WriteLine("姓名:{0},年龄:{1}",name,age);
        }
        public void Show()
        {
            Console.WriteLine("姓名:{0} 年龄:{1} 家乡:{2}", name, age, homeTown);
        }
        Public void Display(string gongzuo)
        {
            Console.WriteLine(gongzuo);
}
    }
}

自定义特性类

l  正确设计自定义属性类的主要步骤如下:

应用 AttributeUsageAttribute

声明属性类

声明构造函数

声明属性

1.  工具——选项——项目和解决方案——总是显示解决方案

2.  添加类库

Class1类

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

namespace ClassLibrary1
{
    [AttributeUsage(AttributeTargets.Class| AttributeTargets.Method,AllowMultiple=true,Inherited=true)]
    public class Class1:System.Attribute
    {
        int age;

        public int Age
        {
            get { return age; }
            set { age = value; }
        }
        string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        string level;

        public string Level
        {
            get { return level; }
            set { level = value; }
        }
        public Class1()
        {
            age=0;
            name = "不详";
            level = "不详";
        }
        public Class1(string name,int age)
        {
            this.name = name;
            this.age = age;
        }
    }
}

类Class2

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

namespace ClassLibrary1
{
    [Class1("张三",24,Level="同学你好")]
    class Class2:System.Attribute
    {
        [Class1("里斯",23,Level="同学你也好")]
        public void Eat()
        { }
    }
}


主函数
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Assembly ass = Assembly.Load("ClassLibrary1");
            Type tp = ass.GetType("ClassLibrary1.Class2");
            object[] ob = tp.GetCustomAttributes(typeof(ClassLibrary1.Class1), false);
            ClassLibrary1.Class1 cc = ob[0] as ClassLibrary1.Class1;
            Console.WriteLine("类型名为{0} 是由{1}创建的 他的年龄是{2} 他要说的话是{3}", tp.Name, cc.Name, cc.Age, cc.Level);

            Assembly ass1 = Assembly.Load("ClassLibrary1");
            Type tp1 = ass1.GetType("ClassLibrary1.Class2");
            MethodInfo met = tp1.GetMethod("Eat");
            //GetCustomAttributes在派生类中被重写时,返回有System.type标示的自定义属性数组。
            //(typeof(ClassLibrary1.Class1), true)要搜索的属性类型,只返回可分配给此类型的属性。
            object[] ob1 = met.GetCustomAttributes(typeof(ClassLibrary1.Class1), true);
            ClassLibrary1.Class1 cc1 = ob1[0] as ClassLibrary1.Class1;
            Console.WriteLine("方法的名字是{0} 是由{1}创建的 他的年龄是{2} 他要说的话是{3}", met.Name, cc1.Name, cc1.Age,cc1.Level);
            Console.Read();
        }
    }
}

完毕!哪里有错误的地方各位大虾积极指正昂,小妹恭候!

 

posted on 2012-11-23 10:54  张洁MM  阅读(2464)  评论(12编辑  收藏  举报