服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#反射的入门之C#反射实例

C#反射的入门之C#反射实例

2021-03-16 00:02CSharp编程大全zls365 C#

C#反射的入门学习首先要明白C#反射提供了封装程序集、模块和类型的对象等等。那么这样可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属

C#反射的入门之C#反射实例

C#反射的入门学习首先要明白C#反射提供了封装程序集、模块和类型的对象等等。那么这样可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。

MSDN描述:

反射通常具有以下用途:

使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。

使用 Module 发现以下信息:包含模块的程序集以及模块中的类等。您还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。

使用 ConstructorInfo 发现以下信息:构造函数的名称、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。使用 Type 的 GetConstructors 或 GetConstructor 方法来调用特定的构造函数。

使用 MethodInfo 发现以下信息:方法的名称、返回类型、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。使用 Type 的 GetMethods 或 GetMethod 方法来调用特定的方法。

使用 FieldInfo 发现以下信息:字段的名称、访问修饰符(如 public 或 private)和实现详细信息(如 static)等;并获取或设置字段值。

使用 EventInfo 发现以下信息:事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等;并添加或移除事件处理程序。

使用 PropertyInfo 发现以下信息:属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。

使用 ParameterInfo 发现以下信息:参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置等。

当您在一个应用程序域的仅反射上下文中工作时,请使用 CustomAttributeData 来了解有关自定义属性的信息。使用 CustomAttributeData,您不必创建属性的实例就可以检查它们。

System.Reflection.Emit 命名空间的类提供了一种特殊形式的反射,使您能够在运行时生成类型。

反射也可用于创建称作类型浏览器的应用程序,它使用户能够选择类型,然后查看有关选定类型的信息。

反射还有其他一些用途。JScript 等语言编译器使用反射来构造符号表。System.Runtime.Serialization 命名空间中的类使用反射来访问数据并确定要持久保存的字段。System.Runtime.Remoting 命名空间中的类通过序列化来间接地使用反射。

一个最简单的C#反射实例,首先编写类库如下:

using System;    

namespace ReflectionTest 

    public class WriteTest 

    {   

        //public method with parametors   

        public void WriteString(string s, int i) 

        { 

            Console.WriteLine("WriteString:" + s + i.ToString()); 

        } 

  

        //static method with only one parametor   

        public static void StaticWriteString(string s) 

        { 

            Console.WriteLine("StaticWriteString:" + s); 

        } 

  

        //static method with no parametor   

        public static void NoneParaWriteString() 

        { 

            Console.WriteLine("NoParaWriteString"); 

        } 

    } 

使用命令行编译csc /t:library ReflectTest.cs命令进行编译,生成ReflectTest.dll库文件。

然后进行下列程序的编写:

using System;   

using System.Reflection;    

class TestApp 

    public static void Main() 

    { 

        Assembly ass; 

        Type type; 

        Object obj; 

  

        Object any = new Object(); 

        ass = Assembly.LoadFile(@"@"C:\Users\luogy\Desktop\1\ReflectionTest.dll""); 

        type = ass.GetType("ReflectionTest.WriteTest"); 

  

        /*example1---------*/ 

        MethodInfo method = type.GetMethod("WriteString"); 

        string test = "test"

        int i = 1; 

        Object[] parametors = new Object[] { test, i }; 

        obj = ass.CreateInstance("ReflectionTest.WriteTest"); 

        method.Invoke(obj,//Instance object of the class need to be reflect   

            parametors); 

        //method.Invoke(any, parametors);//RuntimeError: class reference is wrong    

  

        /*example2----------*/ 

        method = type.GetMethod("StaticWriteString"); 

        method.Invoke(null, new string[] { "test" }); 

        method.Invoke(obj, new string[] { "test" }); 

        method.Invoke(any, new string[] { "test" });  

  

        /*example3-----------*/ 

        method = type.GetMethod("NoneParaWriteString"); 

        method.Invoke(nullnull); 

Console.ReadKey();     

    } 

运行结果:

C#反射的入门之C#反射实例

C#反射学习时几点注意内容:

1.指定类库文件必须使用绝对路径,不能使用相对路径(其实感觉有点不合理,不太方便)

2.19行,命名空间和类的名字必须一起指定

3.在例子1种必须实例化反射要反射的类,因为要使用的方法并不是静态方法。

4.由于这个方法有两个参数,可以用这种Object的方法指定参数也可以直接写method.Invoke(obj, new Object[] { "test", 1 });

5.在例子2种我们想用的方法是一个静态方法,这时候Invoke的时候,对于第一个参数是无视的,也就是我们写什么都不会被调用,即使我们随便new了一个any这样的Object,当然这种写法是不推荐的。但是对应在例子1种我们如果Invoke的时候用了类型不一致的实例来做为参数的话,将会导致一个运行时的错误。

6.第三个例子是一个调用无参数静态方法的例子,这时候两个参数我们都不需要指定,用null就可以了。

再说一个问题,如果调用的类是静态类的时候,需要注意一个问题,肯定我们会想到一个问题,静态类是不能实例化的,这时候,31行的类的实例化的方法我们就不需要了,直接使用Invoke就可以实现,否则将会出现运行时的错误,同样的道理,第一个参数将会被无视,只要我们传对了参数就可以了。

C#反射以及C#反射实例的相关内容就向你介绍到这里,希望对你了解和学习C#反射以及C#反射实例应用有所帮助。

原文地址:https://mp.weixin.qq.com/s/delEyfryIr9N-VPv3sYUhg

延伸 · 阅读

精彩推荐
  • C#浅谈C# winForm 窗体闪烁的问题

    浅谈C# winForm 窗体闪烁的问题

    下面小编就为大家带来一篇浅谈C# winForm 窗体闪烁的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C#教程网7962021-12-21
  • C#C# 后台处理图片的几种方法

    C# 后台处理图片的几种方法

    本篇文章主要介绍了C# 后台处理图片的几种方法,非常具有实用价值,需要的朋友可以参考下。...

    IT小伙儿10162021-12-08
  • C#c#学习之30分钟学会XAML

    c#学习之30分钟学会XAML

    一个界面程序的核心,无疑就是界面和后台代码,而xaml就是微软为构建应用程序界面而创建的一种描述性语言,也就是说,这东西是搞界面的...

    C#教程网8812021-12-10
  • C#C#直线的最小二乘法线性回归运算实例

    C#直线的最小二乘法线性回归运算实例

    这篇文章主要介绍了C#直线的最小二乘法线性回归运算方法,实例分析了给定一组点,用最小二乘法进行线性回归运算的实现技巧,具有一定参考借鉴价值,需要...

    北风其凉8912021-10-18
  • C#Unity3D UGUI实现缩放循环拖动卡牌展示效果

    Unity3D UGUI实现缩放循环拖动卡牌展示效果

    这篇文章主要为大家详细介绍了Unity3D UGUI实现缩放循环拖动展示卡牌效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参...

    诗远3662022-03-11
  • C#C#基础之泛型

    C#基础之泛型

    泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个新功能。接下来通过本文给大家介绍c#基础之泛型,感兴趣的朋友一起学习吧...

    方小白7732021-12-03
  • C#聊一聊C#接口问题 新手速来围观

    聊一聊C#接口问题 新手速来围观

    聊一聊C#接口问题,新手速来围观,一个通俗易懂的例子帮助大家更好的理解C#接口问题,感兴趣的小伙伴们可以参考一下...

    zenkey7072021-12-03
  • C#C#实现的文件操作封装类完整实例【删除,移动,复制,重命名】

    C#实现的文件操作封装类完整实例【删除,移动,复制,重命名】

    这篇文章主要介绍了C#实现的文件操作封装类,结合完整实例形式分析了C#封装文件的删除,移动,复制,重命名等操作相关实现技巧,需要的朋友可以参考下...

    Rising_Sun3892021-12-28