C#C#基础知识回顾– 反射(4)

起程序集拿到路

  先说点题外话,现在技术确实发展最为抢了。我当时边还多事物半生不熟

啊,这边又起了广大妙不可言之新物吃你羡慕不已。学如故免仿就还算

个问题。Node.js
bootstrap,我多年来恰好发现的新技巧,其实她们早就

存老悠久了,只是没有接触过耳。今日傍晚看Node.js一下子望个别点

基本上,感觉真是无比有意思了^,有趣味的可以去看,我们差不多交换沟通.

  好了不赘述了,在前方的以身作则中,几乎一切的MyClass音讯都是经过反射得到的,可是有一个异:

MyClass类型本身。即便眼前的言传身教可以动态确定MyClass的音信,但它们以因以下事实:事先知道

色名MyClass,并且在typeof语句被行使它们创制一个Type对象。尽管这种办法或者在过剩条件中都来

故,不过假诺抒发反射的全部力量,就非得能够透过分析任何程序集的内容动态的收获可用之花色。

  程序集提供了它含有的类似与结构的信。借助反射应用程序接口,可以加载程序集,获取其的交互

拉音信并创其官可用类型的实例。通过使用这种机制,程序会搜素其环境,利用这多少个神秘的效用一旦

C#,毋庸当编译期间显得的定义他们。由于体系的布满音信都得让察觉,由此无有反射应用的内在限制。

为取程序集的相干音信,首先需要成立一个Assembly对象。Assembly类并没有定义公有的

构造函数,它的靶子实例是因此类似的一个智拿到的。这里用的LoadFrom()方法好加载由文件称

点名的程序集,其情势如下:

  static Assembly LoadFrom(string
fileName)

要取得了Assembly类型的目的,就得经调用该目标的GetType()来抱她所定义之档次

。基本形式如下:

  Type[] GetTypes()

  此方法重回一个屡组,它含了先后集的门类。

  为了表达什么收获程序集的花色,我们得在解决方案中补充加一个类库,类库名字也MyClasses,

于类库中上加三单近乎:MyClass、AnotherClass、Demo。代码如下:

程序集MyClasses代码

 

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

namespace MyClasses
{
    public class MyClass
    {
        int x;
        int y;

        public MyClass(int i)
        {
            Console.WriteLine("一个参数的构造函数:");
            x = y = i;
        }
        public MyClass(int i, int j)
        {
            Console.WriteLine("两个参数构造函数:");
            x = i;
            y = j;

            Show();
        }

        public int Sum()
        {
            return x + y;
        }

        public bool IsBetween(int i)
        {
            if (x < i && i < y)
                return true;
            else
                return false;
        }

        public void Set(int a, int b)
        {
            Console.Write("函数:Set(int a, int b)");
            x = a;
            y = b;

            Show();
        }

        public void Set(double a, double b)
        {
            Console.Write("函数:Set(double a, double b)");

            x = (int)a;
            y = (int)b;

            Show();
        }

        public void Show()
        {
            Console.WriteLine("x:{0},y:{1}", x, y);
        }

    }

    public class AnotherClass
    {
        string msg;

        public AnotherClass(string msg)
        {
            this.msg = msg;
        }

        public void show() {
            Console.WriteLine(msg);
        }
    }
    public class Demo
    {
        public void test()
        {
            Console.WriteLine("我是打酱油的!!");
        }
    }
}

 

使用反射代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace Reflection
{
    class Program
    {
        static void Main(string[] args)
        {

            ReflectAssemblyDemo();
            Console.ReadKey();
        }


        static void ReflectAssemblyDemo()
        {
            int val;

            Assembly asm = Assembly.LoadFrom("MyClasses.dll");

            Type[] allTypes = asm.GetTypes();

            foreach (Type type in allTypes)
            {
                Console.WriteLine("程序集中找到类:" + type.Name);
            }
            Console.WriteLine();

            //使用第一个类
            Type t = allTypes[0];

            Console.WriteLine("使用类:" + t.Name);

            //获得构造函数
            ConstructorInfo[] ci = t.GetConstructors();

            //显示此类中的构造函数
            Console.WriteLine("此类中的构造函数有:");

            foreach (ConstructorInfo c in ci)
            {
                Console.Write("  " + t.Name + " (");

                ParameterInfo[] pi = c.GetParameters();

                for (int i = 0; i < pi.Length; i++)
                {
                    Console.Write(pi[i].ParameterType.Name + " " + pi[i].Name);

                    if (i + 1 < pi.Length) Console.Write(",");
                }

                Console.WriteLine(")");
            }

            //获取匹配的构造函数

            int x;

            for (x = 0; x < ci.Length; x++)
            {
                ParameterInfo[] pi = ci[x].GetParameters();
                if (pi.Length == 2) break;
            }

            if (ci.Length == x)
            {
                Console.WriteLine("没有匹配的构造函数");
                return;
            }
            else
            {
                object[] consargs = new object[2];

                consargs[0] = 10;
                consargs[1] = 20;

                object reflectOb = ci[x].Invoke(consargs);

                Console.WriteLine("通过reflectOb调用方法");

                Console.WriteLine();

                MethodInfo[] mi = t.GetMethods();

                foreach (MethodInfo m in mi)
                {
                    //获得方法参数

                    ParameterInfo[] pi = m.GetParameters();

                    if (m.Name.CompareTo("Set") == 0 && pi[0].ParameterType == typeof(int))
                    {
                        object[] args = new object[2];

                        args[0] = 9;
                        args[1] = 18;

                        m.Invoke(reflectOb, args);
                    }
                    else if (m.Name.CompareTo("Set") == 0 && pi[0].ParameterType == typeof(double))
                    {
                        object[] args = new object[2];

                        args[0] = 1.25;
                        args[1] = 7.5;

                        m.Invoke(reflectOb, args);
                    }
                    else if (m.Name.CompareTo("Sum") == 0)
                    {
                        val = (int)m.Invoke(reflectOb, null);

                        Console.WriteLine("Sum is {0}", val);
                    }
                    else if (m.Name.CompareTo("IsBetween") == 0)
                    {
                        object[] args = new object[1];

                        args[0] = 13;

                        if ((bool)m.Invoke(reflectOb, args))
                        {
                            Console.WriteLine("13 is between x and y");
                        }

                    }
                    else if (m.Name.CompareTo("Show") == 0)
                    {
                        m.Invoke(reflectOb, null);
                    }
                }
            }
        }
    }
}

运行结果:

 

C# 1

  自此,反射部分基本内容写了了.希望对咱们有帮衬.现在正进展WPF开发,我会拿以品种开发被遭受的题材跟缓解方案就和公分享,希望您会继续拉注.

  最终,倘若本文对君有匡助,请点推荐,谢谢!

 

相关文章