c#反射示例

对反射还是刚刚接触,先贴一下代码吧,太过理论的东西现在我也不大懂

1.接口

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

namespace ReflectDll
{
    interface IEatAndFly//定义一组吃饭和飞的行为
    {
        string Name//定义属性
        {
            get;
            set;
        }
        void Fly();
        void Eat();
    }
}

2.类

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

namespace ReflectDll
{
    class Duck:IEatAndFly
    {
        private string name;

        #region IEatAndFly 成员
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }

        public void Fly()
        {
            Console.WriteLine("鸭子飞了");
        }

        public void Eat()
        {
            Console.WriteLine("鸭子吃饭了");
        }

        #endregion

        public Duck(string name)
        {
            this.name = name;
        }

        //private void Add(int m, int n)
        //{
        //    Console.WriteLine("{0}+{1}={2}", m, n, m + n);
        //}

        public void PubAdd(int m, int n)
        {
            Console.WriteLine("{0}+{1}={2}", m, n, m + n);
        }
        public void PubAdd(string s)
        {
            Console.WriteLine("string 参数方法" + s);
        }
        static void Main(string[] args)
        {
            Duck d = new Duck("SS");
            d.PubAdd(2, 3);
        }
    }

}
测试客户端

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

namespace Re
{
    class Program
    {
        static void Main(string[] args)
        {
            Test2();
        }

        static void Test1()
        {
            Assembly ass = Assembly.Load("Genersoft.TB.Base");//这个地方时程序集名称,非DLL文件名
            System.Console.WriteLine("1.Assembly的公共属性:");

            #region 1.公共属性
            System.Console.WriteLine("CodeBase(指定程序集的位置):" + ass.CodeBase);
            System.Console.WriteLine("EntryPoint(程序集的入口点):" + ass.EntryPoint);
            System.Console.WriteLine("FullName(程序集的显示名称)" + ass.FullName);
            System.Console.WriteLine("GlobalAssemblyCache(是否从GAC中加载)" + ass.GlobalAssemblyCache);
            System.Console.WriteLine("HostContext(获取加载程序集的宿主上下文:)" + ass.HostContext);
            System.Console.WriteLine("ImageRuntimeVersion(获取公共语言运行时版本)" + ass.ImageRuntimeVersion);
            System.Console.WriteLine("Location(获取包含清单的已加载的文件路径)" + ass.Location);
            System.Console.WriteLine("ManifestModule(获取加载模块)" + ass.ManifestModule);
            System.Console.WriteLine("ReflectionOnly(是否被加载只反射上下文)" + ass.ReflectionOnly);
            #endregion

            #region 2.Assembly的公共方法
            AssemblyName[] assemblyName = ass.GetReferencedAssemblies();//获取改程序集引用的程序集名称
            foreach (AssemblyName a in assemblyName)
            {
                System.Console.WriteLine("程序集名称" + a.Name);
            }
            Type[] types = ass.GetTypes();//为毛提示无法加载一个或多个请求的类型??? 应该是它依赖的程序集没有加载的原因,你妹的啊()
            foreach (Type t in types)
            {
                Console.WriteLine("类型:----------" + t.Name);
                BindingFlags bind = BindingFlags.Public | BindingFlags.Static;
                foreach (MemberInfo m in t.GetMember("a", bind))
                {
                    string typeName = string.Empty;
                    if (m is FieldInfo) typeName = "FieldInfo";
                    else if (m is MethodInfo) typeName = "MethodInfo";
                    else if (m is ConstructorInfo) typeName = "Constructor";
                    Console.WriteLine("成员---" + typeName + m.Name);

                }
            }
            //Module[] moduls = ass.GetModules();//获取程序集中的模块
            //foreach (Module m in moduls)
            //{
            //    Console.WriteLine("模块"+m.Name);
            //}
            #endregion

            //#region 3.Type的相关属性和方法
            //Type type = ass.GetType();
            //Console.WriteLine(type.Name);
            //#endregion
            //Assembly[] asss = AppDomain.CurrentDomain.GetAssemblies();
            //foreach (Assembly a in asss)
            //{
            //    Console.WriteLine("---------" + a);
            //    foreach (Type t in a.GetExportedTypes())
            //    {
            //        Console.WriteLine(".............." + t.Name);
            //    }
            //}
        }

        static void Test2()
        {
            Assembly ass = Assembly.Load("ReflectDll");//建议使用的一种加载方式
            Console.WriteLine("Type类型-------------------------");
            Type[] types = ass.GetTypes();//调用这个方法时,如果要加载的程序集依赖的程序集没有提供,会报异常,应该是返回类吧,接口有特定的方法
            foreach (Type type in types)
            {
                Console.WriteLine(type);
                Console.WriteLine("Interface接口");
                Type[] ints = type.GetInterfaces();
                foreach (Type tt in ints)
                {
                    Console.WriteLine(tt);
                }
                Console.WriteLine("Member成员>>>>>>>>>>>>>>>>>>>>>>");
                MemberInfo[] members = type.GetMembers();//返回的是所有的共有成员
                foreach (MemberInfo m in members)
                {
                    Console.WriteLine(m.MemberType+":"+m.Name);//MemberType标志是属性,方法还是其它
                }
            }
            Console.WriteLine("Module模块------------------------");
            Module[] modules = ass.GetModules();
            foreach (Module m in modules)
            {
                Console.WriteLine(m);
            }

            /*
             *  1. System.Activator 的CreateInstance方法。该方法返回新对象的引用。具体使用方法参见msnd
             * 2.Assembly的CreateInstance;
                3. System.Activator 的createInstanceFrom 与上一个方法类似,不过需要指定类型及其程序集
                4.System.Appdomain 的方法:createInstance,CreateInstanceAndUnwrap,CreateInstranceFrom和CreateInstraceFromAndUnwrap
                5. System.type的InvokeMember实例方法:这个方法返回一个与传入参数相符的构造函数,并构造该类型。
                6.System.reflection.constructinfo 的Invoke实例方法
             */
            #region 构造实例的几种方式
            //1.Activator.CreateInstance()
            Type duckType = ass.GetType("ReflectDll.Duck");//要创建的实例的类型
            Object[] args1 = new object[] { "我是第一种方式创建的" };
            Object obj1 = Activator.CreateInstance(duckType, args1);
            //2.利用Assembly.CreateInstance
            Object obj2 = ass.CreateInstance("ReflectDll.Duck", true, BindingFlags.Public | BindingFlags.Instance, null, new object[] { "我是从程序集创建的" }, null, null);
            //利用InvokeMember方法
            Object obj3 = duckType.InvokeMember("ReflectDll.Duck", BindingFlags.Instance | BindingFlags.Public|BindingFlags.CreateInstance, null, null, new object[] { "我使用InvokeMember方法创建的" });//注意BindingFlagstaff要选择CreateInstance值
            #endregion

            #region 调用方法
            //1,利用Type.InvokeMember方法
            duckType.InvokeMember("PubAdd", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, obj1, new object[] { 1, 1 });//注意BindingFlags加上InvokeMethod,target选择已经实例好的类
            //2.利用MethodInfo方法,先找到方法
            Type[] ts = new Type[] { typeof(int), typeof(int) };
            MethodInfo mAdd = duckType.GetMethod("PubAdd", BindingFlags.Public | BindingFlags.Instance, null, CallingConventions.Standard,ts , null);
            mAdd.Invoke(obj2, new object[] { 2, 2 });
            #endregion
        }
    }
}




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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值