C#反射机制

与java非常相似,而且还能分析dll文件中的类

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

namespace ConsoleApplication3WcfCilent
{
    class Program
    {
        static void Main(string[] args)
        {
            /**
            Console.WriteLine("hello");
            Service1Client s = new Service1Client();
            WcfService1.CompositeType cp = new WcfService1.CompositeType();
            cp.BoolValue = true;
            s.GetDataUsingDataContract(cp);
            var x=s.GetData(2);
            Console.WriteLine(x);
            Console.WriteLine(cp.StringValue);         
           
            */
            /反射 获取某个dll的所有类型
            int i,j;
            //加载dll
            Assembly assembly=Assembly.LoadFrom("myDll.dll");         
            //所有类型
            Type[] types=assembly.GetTypes();
            Console.WriteLine(assembly.GetName().Name+"包括类型:");
            //循环输出类型名称
            for(i=0;i<types.GetLength(0);++i)
            {
              Console.WriteLine("\r("+i+")  " + types[i].Name);
            }
            i=types.Length - 1;
            Console.WriteLine("选择类型对应数字(0-"+i+");");

            //控制台输入
            //j=Convert.ToInt32(Console.ReadLine());
            j = 3;
            Console.WriteLine();
            //判断选择的类型是否是sport类的子类
            if(types[j].IsSubclassOf(typeof(Sport)))
            {
                //类型的结果信息
                ConstructorInfo ci=types[j].GetConstructor(new Type[0]);
                //使用指定参数调用当前构造函数,生成对象
                Sport sport=(Sport)ci.Invoke(new Object[0]);
                //调用对象方法
                Console.WriteLine(sport.GetName() + " has " + sport.GetDuration());
            }
            else
            {
                Console.WriteLine(types[j].Name + "不是Sport的子类");
             }
            ///
            //获取某个类型的所有属性
            Type t1 = typeof(Soccer);
            //特性
            PropertyInfo[] pps = t1.GetProperties();
            //成员
            MemberInfo[] mms = t1.GetMembers();
            //方法
            MethodInfo[] mts = t1.GetMethods();
            //属性
            FieldInfo[] ffs = t1.GetFields();
            Console.WriteLine("PropertyInfo:"+pps.Length);
            for (i = 0; i < pps.Length; i++)
            {
                Console.WriteLine("\r(" + i + ")  " + pps[i].Name);
            }
            Console.WriteLine("MemberInfo:" + mms.Length);
            for (i = 0; i < mms.Length; i++)
            {
                Console.WriteLine("\r(" + i + ")  " + mms[i].Name);
            }
            Console.WriteLine("FieldInfo:" + mts.Length);
            for (i = 0; i < ffs.Length; i++)
            {
                Console.WriteLine("\r(" + i + ")  " + ffs[i].Name);
            }
            Console.WriteLine("MethodInfo:"+mts.Length);
            for (i = 0; i < mts.Length; i++)
            {
                Console.WriteLine("\r(" + i + ")  " + mts[i].Name);
            }
            //属性设置
            Sport s1 = new Soccer();
            Console.WriteLine("原值:"+s1.name);//默认soccer
            try {
                FieldInfo ff=t1.GetField("name");
                ff.SetValue(s1,"testdd");
                Console.WriteLine("赋值后:" + s1.name);
            }
            catch (Exception e) {
                Console.WriteLine(e.Message);
            }
            //操作方法
            MethodInfo mm = t1.GetMethod("GetName");
            Console.WriteLine("调用GetName方法返回:"+mm.Invoke(s1, null));
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值