在C#中反射的知识和Type类一起运用得很紧密。要说反射的运用方向,其实MVC就是利用了反射的知识。另外,如果你想做插件,反射的知识也是必不可少的。

C#反射_C

Do类:

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

namespace TestDll
{
    public class Do
    {
        public string Name;
        public event Action CallBack;

        public Do()
        {

        }
        public Do(String name , Int32 age)
        {
            this.Name = name;
            this.Age = age;
        }
        public Int32 Age
        {
            get;
            set;
        }
        public void DoSomeThing()
        {
            Console.WriteLine("Do.DoSomeThing(没有参数) 执行操作!");
        }

        public void DoSomeThing( string mask )
        {
            Console.WriteLine("Do.DoSomeThing(有参数) 执行操作!{0}", mask);
        }
    }
}

关于控制台测试程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using TestDll;

namespace TestReflect
{
    class Program
    {
        static void Main(string[] args)
        {
            Assembly _assembly = Assembly.Load("TestDll");//加载程序集,并解析里面的matedata
            Type _ty = _assembly.GetType("TestDll.Do");

            //------实例化篇
            object _ob = Activator.CreateInstance(_ty);//实例化一个对象 , 相当于New
            object _obOverride = Activator.CreateInstance(_ty, "Ainy", 27);//实例化一个有参数的重载构造函数
            ///////////////////////////////////////////////////////////////////////////////
            //这个_ob(Object)实际上就是Do
            Do _testDo = _ob as Do;
            _testDo.DoSomeThing();
            ///////////////////////////////////////////////////////////////////////////////

            foreach(MethodInfo _methodItem in _ty.GetMethods())
            {
                Console.WriteLine("方法 : {0}" , _methodItem.Name);
            }
            //------方法篇
            MethodInfo _hasParm = _ty.GetMethod("DoSomeThing", new Type[] { typeof(String) });//得到一个有String参数的方法 :DoSomeThing
            //执行方法 : DoSomeThing(有参数的)
            _hasParm.Invoke(_ob, new object[] { "Aonaufly" });
            MethodInfo _noParm = _ty.GetMethod("DoSomeThing",new Type[]{});//获取不带参数的方法
            _noParm.Invoke(_ob,new Object[]{});//执行无参数的方法

            //------字段篇
           FieldInfo _name = _ty.GetField("Name");
           _name.SetValue(_ob,  "Aonaufly1");

            //------属性篇
           PropertyInfo _age = _ty.GetProperty("Age");
           _age.SetValue(_ob, 18);
            

            Console.ReadKey();
        }
    }
}

需要指出的问题:

1:类库的DLL,PDB文件要拷贝到程序集的Bin文件中。PDB文件可让程序进入调试。

C#反射_ 反射_02

C#反射_ 反射_03

2:Assembly.Load("TestDll")

    实际是加载程序集(并解析matedata数据)。程序集即为:C#反射_C_04

3:_assembly.GetType("TestDll.Do")

    家在Do类,以便调用


好了,看看执行结果:

C#反射_C_05