1. 程式人生 > >c#反射Type型別的一些方法介紹

c#反射Type型別的一些方法介紹

=====TestLib.dll檔案內容========

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

namespace TestLib
{
    public class Class1
    {
        private int _age;

        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }

        private string _name;

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        public void SayHi()
        {
            Console.WriteLine("大家好!");
        }

        public void AAA()
        {
            MyClass mc = new MyClass();
            mc.BBB();
        }
    }

    public interface IFlyable
    {
        void Fly();
    }

    public delegate void MyDelegate();

    public enum Good
    {
        高,
        富,
        帥
    }

    internal class MyClass
    {
        internal void BBB()
        {
            Console.WriteLine("能看到嗎》");
        }
    }

    public class Person
    {
        public string Name
        {
            get;
            set;
        }
        public int Age
        {
            get;
            set;
        }
        public string Email
        {
            get;
            set;
        }

    }

    public class Chinese : Person, IZiWoXiuFu
    {
        //戶口
        public string HuKouSuoZaiDi
        {
            get;
            set;
        }

        #region IZiWoXiuFu 成員

        public void XiuFu()
        {
            Console.WriteLine("以毒攻毒,配平了。");
        }

        #endregion
    }

    public interface IZiWoXiuFu
    {
        void XiuFu();
    }

    public abstract class MyAbsClass
    {
        public abstract void SayHello();
    }

    public static class MyStaticClass
    {

    }
}

=====控制檯program.cs檔案內容========

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

namespace _10Type型別的一些方法介紹
{
    class Program
    {
        static void Main(string[] args)
        {
            //1.動態載入程式集
            Assembly asm = Assembly.LoadFile(@"C:\testlib.dll");

            //2.1獲取Chinese型別的Type
            Type typChinese = asm.GetType("TestLib.Chinese");

            //2.2獲取Person型別的Type
            Type typPerson = asm.GetType("TestLib.Person");

            //2.3獲取介面型別的Type
            Type typIXiuFu = asm.GetType("TestLib.IZiWoXiuFu");

            //2.4獲取抽象類MyAbsClass的Type
            Type typMyAbsClass = asm.GetType("TestLib.MyAbsClass");

            //2.5獲取靜態類MyStaticClass的Type
            Type typMyStaticClass = asm.GetType("TestLib.MyStaticClass");


            #region IsAssignableFrom
            //3.驗證一下Person型別是不是Chinese型別的父類。
            //驗證是不是可以把typChinese型別的物件賦值給typPerson型別。
            //bool b = typPerson.IsAssignableFrom(typChinese);
            //Console.WriteLine(b);//true,因為Chinese繼承了Person

            ////判斷是否可以將typChinese的物件賦值給typIXiuFu型別
            //bool b = typIXiuFu.IsAssignableFrom(typChinese);
            //Console.WriteLine(b);


            #endregion

            #region IsInstanceOfType
            ////建立了一個typChinese型別的物件obj
            //object obj = Activator.CreateInstance(typChinese);

            //////驗證obj是不是typChinese型別的物件
            ////bool b = typChinese.IsInstanceOfType(obj);
            ////Console.WriteLine(b);//true

            //////驗證obj是不是typPerson型別的物件
            ////bool b = typPerson.IsInstanceOfType(obj);
            ////Console.WriteLine(b);//true


            //Console.ReadKey();

            #endregion

            #region IsSubclassOf

            ////驗證typChinese是否是typPerson的子類
            ////bool b = typChinese.IsSubclassOf(typPerson);
            ////Console.WriteLine(b);


            ////判斷typChinese是否是typIXiuFu的子類
            ////IsSubclassOf不考慮介面,只考慮父子類關係。
            //bool b = typChinese.IsSubclassOf(typIXiuFu);
            //Console.WriteLine(b);
            //Console.ReadKey();


            #endregion

            #region IsAbstract,判斷某個型別是否是一個抽象的。


            //Console.WriteLine(typChinese.IsAbstract);
            //Console.WriteLine(typPerson.IsAbstract);

            ////介面、抽象類、靜態類都不能被例項化,所以這裡都認為是“抽象的”
            //Console.WriteLine(typIXiuFu.IsAbstract);
            //Console.WriteLine(typMyAbsClass.IsAbstract);
            //Console.WriteLine(typMyStaticClass.IsAbstract);
            //Console.ReadKey();

            #endregion

        }
    }
}