您的位置:首页 > 其它

隔空取物——reflection

2015-12-21 19:47 141 查看


1,什么是反射

生物学说,反射是在中枢神经系统参与下,机体对内外环境刺激所作出的规律性反应。物理学说,反射是声波、光波或其他电磁波遇到别的媒质分界面而部分仍在原物质中传播的现象。计算机说,反射提通过
System.Reflection 命名空间中的类以及 System.Type,您可以获取有关已加载的程序集和在其中定义的类型(如类、接口和值类型)的信息。 您也可以使用反射在运行时创建类型实例,以及调用和访问这些实例。那么我说,他的好处就是隔空取物。


为什么理解成为一种隔空取物呢,网上看到了一个例子——B超,向人体发射超声波,同时接受体内脏器的反射波,将所携信息反映在屏幕上。再不像,做一个例子给大家看看。

2,示例:

(1),首先使用C#语言建立项目。











Reflection、TestDLL是控制台应用程序,其中,Reflection是要我们反射取物的结果,而TestDll是我们所要反射的项目,在TestDll这个项目里面我定义了一个Math类,也就是我们要反射的对象,正是我们需要隔空取得物件。

(2),把TestDll项目的生成输出路径设置为反射的操作方文件下,这是我们隔空取物的重要一步,TestDll的生成的dll直接放在Reflection的Debug目录。






(3),TestDll的Math类写一个方法。

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

namespace TestDll
{
    //TestDll是我们所要反射的项目
    //Math类,也就是我们要反射的对象
    class Math
    {
       
            static int sum = 0;

            public static int Add(int a, int b)
            {

                sum = a + b;

                return sum;

            }
      
    }
}


(4),进行反射

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection; 

namespace Reflection
{
    class Program
    {
        static void Main(string[] args)
        {
            //通过DLL文件全名反射其中的所有类型
            Assembly dll = Assembly.LoadFile(Environment.CurrentDirectory + "\\TestDLL.dll");
            Type math = dll.GetType("TestDll.Math", true);
            MethodInfo method = math.GetMethod("Add");
            String count =method.Invoke(null,new object[]{10,20}).ToString();
            Console.WriteLine("invoke Method:" + count.ToString());

        }
    }
}


在反射的时候我使用
DLL文件全名反射其中的所有类型,也就是反射的时候添加xxx.dll的路径就行了。Assemblyassembly
= Assembly.LoadFrom("xxx.dll的路径")。





3,程序出现的问题:

(1)程序“c:\Users\tsj528019-pc\Desktop\NET考评4.1\反射\Reflection\TestDll\obj\Debug\TestDll.exe”不包含适合于入口点的静态“Main”方法

原来创建项目的时候,用的是“空项目”,我以为这样就会生成类库,实际上,一开始准备运行的时候,就会提示以上错误。

解决办法:右键类库属性,然后将输出类型由控制台应用程序改为类库



(2)未能从程序集“TestDll, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型“TestDll.math”。

TestDll.math名字打错了,这里要区分大小写。



(3)System.InvalidCastException: 指定的转换无效

解决方法:首先,Object中存放的是Integer类型(或者其他数值类型的封装类)的数据,在把object转化为string,而不是int类型。

4,小结

不管反射具体是什么,我了解的就是一种可以帮助降低代码耦合度,隔空取物的东西。感觉和引用差不多。但是比引用更方便。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: