程序集、應用程序域、模塊及反射


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();
        }
    }
}

完畢!哪里有錯誤的地方各位大蝦積極指正昂,小妹恭候!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM