可以通过反射获取程序或程序集中的类、方法、特性。
1.反射的用途:
    (1)使用Assembly加载程序集和定义,加载在程序集清单中获取所包含的模块,以及从此程序集中查找类型并创建该类型的实例。 
    (2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。 
    (3)使用ConstructorInfo了解构造函数的名称、参数、访问修饰符和实现详细信息。 
    (4)使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符和实现详细信息。
    (5)使用FiedInfo了解字段的名称、访问修饰符和实现详细信息,并获取或设置字段值。
    (6)使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,添加或移除事件处理程序。 
    (7)使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。 
    (8)使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。
注:这部分总结引用博友:dodo,他总结的很好。
2.代码实例
2.1 反射加载dll,读取module、类、方法、特性
            Assembly assembly = Assembly.Load("DB.SqlServer");
            Console.WriteLine("---------GetModules------------");
            foreach (var item in assembly.GetModules())
            {
                Console.WriteLine(item.FullyQualifiedName);
            }
            foreach (var item in assembly.GetTypes())
            {
                Console.WriteLine(item.FullName);
            }
            Type typeDbHelper = assembly.GetType("DB.SqlServer.DBHelper");
            foreach (var item in typeDbHelper.GetConstructors())//构造函数
            {
                Console.WriteLine(item.Name); //ctor是构造函数的名称(输出)
            }
            Console.WriteLine("------属性-----");
            foreach (var item in typeDbHelper.GetProperties())
            {
                Console.WriteLine(item.Name);
            }
            Console.WriteLine("------方法-----");
            foreach (var item in typeDbHelper.GetMethods())
            {
                Console.WriteLine(item.Name);
            }
            Console.WriteLine("------属性-----");
            foreach (var item in typeDbHelper.GetFields())
            {
                Console.WriteLine(item.Name);
            }
2.2反射创建对象
            Object objectType = Activator.CreateInstance(typeDbHelper);
            IDBHelper dbHelperReflection = (IDBHelper)objectType;
            dbHelperReflection.Add();
2.3反射调用实例方法
Console.WriteLine("**************反射调用实例方法****************");
            {
                MethodInfo methodInfo = typeDbHelper.GetMethod("Add");
                methodInfo.Invoke(objectType, null);
            }
            {
                MethodInfo method = typeDbHelper.GetMethod("Show1", new Type[] { typeof(string) });
                method.Invoke(objectType, new object[] { "nike" });
            }
            {
                MethodInfo method = typeDbHelper.GetMethod("Show2", new Type[] { typeof(int) });
                method.Invoke(objectType, new object[] { 123 });
            }
            {
                MethodInfo method = typeDbHelper.GetMethod("Show3", BindingFlags.Instance | BindingFlags.NonPublic);
                method.Invoke(objectType, new object[] { "私有方法参数" });
            }
            {
                MethodInfo method = typeDbHelper.GetMethod("ShowGeneric");
                method=method.MakeGenericMethod(typeof(string));
                method.Invoke(objectType, new object[] { "泛型" });
            }
3.DBHelper类
public class DBHelper : IDBHelper
    {
        public string ID { get; set; }
        public string Pname = null;
        public bool Add()
        {
            return true;
        }
        public bool Delete()
        {
            return true;
        }
        public bool Update()
        {
            return true;
        }
        public void Query()
        {
            Console.Write("这是{0}的Query方法", this.GetType().FullName);
        }
        public void Show1(string str)
        {
            Console.WriteLine("参数为{0}", str);
        }
        public void Show2(int num)
        {
            Console.WriteLine("参数为Int,是{0}",num);
        }
        private void Show3(string str)
        {
            Console.WriteLine("这是私有方法,参数为{0}",str);
        }
        public void ShowGeneric<T>(string name)
        {
            Console.WriteLine("这是{0}的ShowGeneric,T={1},name={2}",this.GetType(),typeof(T),name);
        }
    }
注:刚刚学习,有错误的地方请大家给予指出,谢谢。
原文:http://www.cnblogs.com/viktor988/p/6853639.html