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

简介: 从程序集获得类型   先说点题外话,现在技术真的发展太快了。我这边还很多东西半生不熟 呢,那边又出现了好多有趣的新东西让你眼红不已。学还是不学这还真是 个问题。Node.js 、bootstrap,我最近刚发现的新技术,其实他们已经 存在很久了,只是没有接触过而已。
+关注继续查看

从程序集获得类型

  先说点题外话,现在技术真的发展太快了。我这边还很多东西半生不熟

呢,那边又出现了好多有趣的新东西让你眼红不已。学还是不学这还真是

个问题。Node.js 、bootstrap,我最近刚发现的新技术,其实他们已经

存在很久了,只是没有接触过而已。昨天晚上看Node.js一下子看到两点

多,感觉真是太有意思了^,有兴趣的可以去看看,大家多交流交流.

  好了不废话了,在前面的示例中,几乎全部的MyClass信息都是通过反射得到的,但是有一个例外:

MyClass类型本身。虽然前面的示例可以动态确定MyClass的信息,但它们仍基于以下事实:事先知道

类型名MyClass,并且在typeof语句中使用它创建一个Type对象。尽管这种方式可能在很多环境中都有

用,但是要发挥反射的全部功能,就必须能通过分析其他程序集的内容动态的获取可用的类型。

  程序集提供了它包含的类和结构的信息。借助反射应用程序接口,可以加载程序集,获取它的相

关信息并创建其公共可用类型的实例。通过使用这种机制,程序能够搜素其环境,利用那些潜在的功能而

无需在编译期间显示的定义他们。由于类型的全部信息都可以被发现,因此不存在反射应用的内在限制。

为了获取程序集的相关信息,首先需要创建一个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);
                    }
                }
            }
        }
    }
}

运行结果:

 


  自此,反射部分基本内容写完了.希望对大家有所帮助.现在正在进行WPF开发,我会把在项目开发中遇到的问题与解决方案及时与您分享,希望您能继续关注.

  最后,如果本文对您有所帮助,请点推荐,谢谢!

 

目录
相关文章
|
1月前
|
安全 Java 编译器
JAVA注解与反射:看这篇文章就够了2
JAVA注解与反射:看这篇文章就够了
24 0
|
1月前
|
安全 Java 编译器
JAVA注解与反射:看这篇文章就够了1
JAVA注解与反射:看这篇文章就够了
40 0
|
4月前
|
SQL 监控 Java
魔法反射--java反射进阶(实战篇)
相信很多人在初学反射的时候也都会有这个想法(我就不相信就只有我一个人这么蠢!!) 大多数人不了解反射的原因并不是不了解, 而是不知道它到底能用来干什么 今天就来为大家分享一下反射的用法
43 0
|
4月前
|
安全 Java 程序员
魔法反射--java反射初入门(基础篇)
反射被应用于许多方面, spring的注解, jdbc的连接都是基于反射来实现的, 可能在工作中我们很少能用到反射, 但是在面试的过程中面试官经常会问道, 可以不用反射, 但作为一个程序猿, 还是应该了解了解的
49 0
|
8月前
|
设计模式 安全 Java
反射的基本使用
2. 反射机制 2.1 Java Reflection 2.2 Java 反射机制可以完成 2.3 反射相关的主要类 2.4 反射优点和缺点 2.5 反射调用优化-关闭访问检查 3. Class类 3.1 基本介绍 3.2 Class类的常用方法 3.3 获取Class类对象 3.4 哪些类型有Class对象 3.5 类加载 3.6 类加载流程 3.7 通过反射获取类的结构信息 3.8 通过反射创建对象 3.9 通过反射访问类中的成员 3.9.1 访问属性 3.9.2 访问方法
46 0
反射的基本使用
|
缓存 Java Spring
Spring源码学习--new()和反射的实例化区别
本文是博主学习Spring源码的记录,希望对大家有所帮助。
74 0
|
存储 缓存 安全
Java反射进阶—聊聊反射的几个问题
昨天有朋友反映好多反射知识没说到,所以今天算是补充篇,一起看看反射的进阶知识点。
95 0
|
安全 Java
java核心基础--java反射机制详解
在详细了解反射机制之前,我们先来了解一下java代码在计算机中的运行过程: 比如当我们编写好一个类:Student.java,里面包含学生的姓名和年龄,构造方法,其他方法。
|
程序员 C#
C#基础知识学习之 ☀️ | 反射(Reflection) 的含义和用法
C# 反射(Reflection) 反射是.NET中的重要机制,通过反射可以得到*.exe或*.dll等程序集内部的接口、类、方法、字段、属性、特性等信息,还可以动态创建出类型实例并执行其中的方法。 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。 程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。
C#基础知识学习之 ☀️ | 反射(Reflection) 的含义和用法
|
Java C# C++
实战中反射的应用
实战中反射的应用
68 0
实战中反射的应用
相关产品
云迁移中心
推荐文章
更多