c#反射的一些性质运用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ReflactionTest.Infrance;//调用接口的引用
//using ReflactionTest.Sql;//调用实现接口的方法的引用
using System.Data;
using System.Reflection;//反射调用引用
using System.Configuration;


namespace Reflaction


{
    public class Student
    {
        public int id { get; set; }
        public string name { get; set; }
    }
   


    class Program
    {
        static void Main(string[] args)
        {
            Assembly assembly = Assembly.Load(ConfigurationManager.AppSettings["dll"]);//动态加载dall文件  此文件在app.con中配置
            Type type = assembly.GetType(ConfigurationManager.AppSettings["lei"]);//动态加载dll文件下的方法 当反射创建一个实体类的时候 需要得到创建类的Type
            object obj = Activator.CreateInstance(type);//利用反射创建实体类
            IDBSqlHelp db = (IDBSqlHelp)obj;
            db.Query();
            //IDBSqlHelp db = new DBSqlHelp();//实例化接口  注意 应该是new 方法 而不是 接口
            ////db.HellWorld();
            DataSet ds = db.Query();
            if (ds.Tables[0].Rows.Count > 0)
            {
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    Console.WriteLine(ds.Tables[0].Rows[i]["StuAdress"].ToString());
                }
            }


            foreach (Module m in assembly.GetModules())//获取反射的模块名
            {
                Console.WriteLine(m.Name);
            }
            foreach(MethodInfo mm in type.GetMethods())//获取反射下的所有方法名字
            {
                Console.WriteLine(mm.Name);
            }




            //MethodInfo methodinfo = type.GetMethod("Query");//从反射类型(此类型为 上面object创建的实体类)中获取方法(不带参数)
            //DataSet dds = (DataSet)methodinfo.Invoke(obj, null);
            //if (dds.Tables[0].Rows.Count > 0)
            //{
            //    for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
            //    {
            //        Console.WriteLine(ds.Tables[0].Rows[i]["StuAdress"].ToString());
            //    }
            //}
            Console.WriteLine("***************获取id为1的值*************************");
            //带参数的从反射类型中获取方法
            MethodInfo methodinfoById = type.GetMethod("Query", new Type[] { typeof(int) });//查询query方法 并且这个方法有一个整形类型的参数里面的参数可以改变若为string则改为string以此类推
            DataSet ddds=(DataSet)methodinfoById.Invoke(obj,new object[]{1});//调用obj下面的Query方法并且传入id=1的参数
            if (ddds.Tables[0].Rows.Count > 0)
            {
              
                    Console.WriteLine(ddds.Tables[0].Rows[0]["StuAdress"].ToString());
             
            }
            Console.WriteLine("***************获取反射对象的属性*************************");


            Type StudentType = typeof(Student);//获取student的类型 
            object studentobj = Activator.CreateInstance(StudentType);//将student实例化
            foreach (PropertyInfo p in StudentType.GetProperties())
            {
                Console.WriteLine(p.Name);
                if (p.Name == "id")
                {
                    p.SetValue(studentobj, 2);
                   
                }
                if (p.Name == "name")
                {
                    p.SetValue(studentobj, "张萨汗");//将获取到的反射对象的属性赋值


                }


            }








        }
    }
}

猜你喜欢

转载自blog.csdn.net/lihao199611287011/article/details/80183810