C#中反射的使用(How to use reflect in CSharp)(1)

最近想做一个插件式的软件给公司的监控用,初步的想法是使用C#去反射Dll,Invoke其中的方法。此文仅供开发参考,不涉及原理,98%的代码以及2%的废话。

测试Solution是这么建的(.NET FRAMEWORK 4.5.1):

Person类代码:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4
 5 namespace PersonMoudle
 6 {
 7     public class Person
 8     {
 9         public Person()
10         {
11             Name = "Sirius";
12             Age = 25;
13             Height = 172;
14             Sex = "Middle";
15         }
16         public Person(string name, int age, float height, string sex)
17         {
18             Name = name;
19             Age = age;
20             Height = height;
21             Sex = sex;
22         }
23
24         public string Name { get; set; }
25         public int Age { get; set; }
26         public float Height { get; set; }
27         public string Sex { get; set; }
28
29         public void Speak(string words)
30         {
31             Console.WriteLine(words);
32         }
33         private string GetMyName()
34         {
35             return Name.Trim();
36         }
37
38         public string GetMySex()
39         {
40             return Sex;
41         }
42
43         public List<string> BeenCity()
44         {
45             return new List<string>
46             {
47                 "Beijing",
48                 "Jinan",
49                 "NewYork"
50             };
51         }
52
53         public List<string> BennCity(int count)
54         {
55             return new List<string>
56             {
57                 "Beijing",
58                 "Jinan",
59                 "NewYork"
60             }.Take(count).ToList();
61         }
62     }
63 }

控台中反射获取信息代码(控台引用类库项目,也可以load dll,后面的篇幅会写):

 1 using System;
 2 using System.Linq;
 3 using PersonMoudle;
 4
 5 namespace ReflectionTest
 6 {
 7     class Program
 8     {
 9         static void Main(string[] args)
10         {
11             var count = 0;//public count set;
12
13             var person = new Person();
14             var personType = person.GetType();
15             Console.WriteLine("类型名: " + personType.Name);
16             Console.WriteLine("类全名: " + personType.FullName);
17             Console.WriteLine("命名空间名: " + personType.Namespace);
18             Console.WriteLine("程序集名: " + personType.Assembly);
19             Console.WriteLine("模块名: " + personType.Module.Name);
20             Console.WriteLine("是否支持泛型: "+personType.IsConstructedGenericType);
21
22             //获取构造函数信息
23             var conInfo = personType.GetConstructors();
24             Console.WriteLine(personType.FullName + "共有" + conInfo.Count() + "个构造函数");
25             foreach (var constructorInfo in conInfo)
26             {
27                 count += 1;
28                 Console.WriteLine("第" + count + "个构造函数:");
29                 var paramsInfo = constructorInfo.GetParameters();
30                 Console.WriteLine(paramsInfo.Any() ? "参数列表:" : "无参数。");
31                 foreach (var parameterInfo in paramsInfo)
32                 {
33                     Console.WriteLine("第" + (parameterInfo.Position + 1) + "参数名:" + parameterInfo.Name + ", 参数类型:" +
34                                       parameterInfo.ParameterType.FullName);
35                 }
36             }
37             count = 0;
38
39             //获取事件信息
40             var eventInfo = personType.GetEvents();
41             Console.WriteLine(personType.FullName+"共有"+eventInfo.Count()+"个事件");
42
43             //获取字段信息
44             var fields = personType.GetFields();
45             Console.WriteLine(personType.FullName + " has " + fields.Count() + "fields.");
46             foreach (var fieldInfo in fields)
47             {
48                 count += 1;
49                 Console.WriteLine("The "+count+"st field is"+fieldInfo.Name+", type is "+fieldInfo.FieldType);
50             }
51             count = 0;
52
53             //获取接口信息
54             var ifaces = personType.GetInterfaces();
55             Console.WriteLine(personType.FullName + " has " + ifaces.Count() + " interfaces.");
56
57
58             //获取成员信息
59             var members = personType.GetMembers();
60             Console.WriteLine(personType.FullName+" has "+members.Count()+" members.");
61             foreach (var memberInfo in members)
62             {
63                 count += 1;
64                 Console.WriteLine("The " + count + "st member name is " + memberInfo.Name + ", type is " +
65                                   memberInfo.ReflectedType);
66             }
67             count = 0;
68
69             //获取方法信息
70             var methods = personType.GetMethods();
71             Console.WriteLine(personType.FullName+" has "+methods.Count()+" methods.");
72             foreach (var methodInfo in methods)
73             {
74                 count += 1;
75                 var paramInfos = methodInfo.GetParameters();
76                 Console.WriteLine("The " + count + "st method is " + methodInfo.Name + ", return type is " +
77                                   methodInfo.ReturnType + ", param count is " + paramInfos.Count());
78
79                 Console.WriteLine(paramInfos.Any() ? "参数列表:" : "无参数。");
80                 foreach (var parameterInfo in paramInfos)
81                 {
82                     Console.WriteLine("param name:" + parameterInfo.Name + ", param type: " +
83                                       parameterInfo.ParameterType);
84                 }
85             }
86             count = 0;
87
88             //propertites
89             var pros = personType.GetProperties();
90             Console.WriteLine(personType.FullName+" has "+pros.Count()+ "public properties.");
91
92             Console.ReadKey();
93         }
94     }
95 }

下一篇讲如何调用方法。

时间: 2024-07-29 09:28:13

C#中反射的使用(How to use reflect in CSharp)(1)的相关文章

JAVA中反射机制六(java.lang.reflect包)

一.简介 java.lang.reflect包提供了用于获取类和对象的反射信息的类和接口.反射API允许对程序访问有关加载类的字段,方法和构造函数的信息进行编程访问.它允许在安全限制内使用反射的字段,方法和构造函数对其底层对等进行操作. 二.java.lang.reflect AccessibleObject类 java.lang.reflect.AccessibleObject类是Field,Method和Constructor类对象的基类. 它提供了将反射对象标记为在使用它时抑制默认Java

Java语言中反射动态代理接口的解释与演示

Java语言中反射动态代理接口的解释与演示 Java在JDK1.3的时候引入了动态代理机制.可以运用在框架编程与平台编程时候捕获事件.审核数据.日志等功能实现,首先看一下设计模式的UML图解: 当你调用一个接口API时候,实际实现类继承该接口,调用时候经过proxy实现. 在Java中动态代理实现的两个关键接口类与class类分别如下: java.lang.reflect.Proxy java.lang.reflect.InvocationHandler 我们下面就通过InvocationHan

java中反射学习整理

转载请注明:http://blog.csdn.net/j903829182/article/details/38405735 反射主要是指程序可以访问,检测和修改它本身的状态或行为的一种能力. java中反射是一种强大的工具,它能够创建灵活的代码,这些代码可以在运行时装载,无须在组件之间进行链接.反射允许在编写与执行时,使程序能够接入到jvm中的类的内部信息,而不是源代码中选定的类协作的代码.这使反射成为构建灵活应用代码的主要工具.需要注意的是,如果使用不当,反射的成本会很高. package

java中反射

反射 避免硬编码 类对象 (存储了类的信息的对象 类加载的产物) Class 类名.class 直接获得类对象 (简单类型的类对象 int.class) 类的对象.getClass() Class.forName("类名") 通过类名主动加载一个类并获得类对象 类对象.newInstance() 创建类的对象 java中反射,布布扣,bubuko.com

在C++中反射调用.NET(二)

反射调用返回复杂对象的.NET方法 定义数据接口 上一篇在C++中反射调用.NET(一)中,我们简单的介绍了如何使用C++/CLI并且初步使用了反射调用.NET程序集的简单方法,今天我们看看如何在C++与.NET程序集之间传递复杂对象. 先看看.NET程序集的一个返回对象的方法: public IUserInfo GetUserByID(int userId) { IUserInfo userinfo= EntityBuilder.CreateEntity<IUserInfo>(); user

android中反射技术使用实例

在计算机科学领域,反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义.反射 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性.Java 的反射机制的实现要借助于4个类:class,Constructor,Field,

Java中反射的实现方式

所谓反射,是指在运行时状态中,获取类中的属性和方法,以及调用其中的方法的一种机制.这种机制的作用在于获取运行时才知道的类(Class)及其中的属性(Field).方法(Method)以及调用其中的方法,也可以设置其中的属性值. 在Java中实现反射最重要的一步,也是第一步就是获取Class对象,得到Class对象后可以通过该对象调用相应的方法来获取该类中的属性.方法以及调用该类中的方法. Java中反射有如下几种实现方式: 1.通过Class.forName()方法加载字符串,就可以得到该字符串

Java中反射机制(Reflection)研究及源码演示

如下内容内容是关于 Java中反射机制(Reflection)研究及演示的内容. package com.jiangqq.reflection; import java.lang.reflect.Method; public class Reflection1 { public static void main(String[] args) throws Exception { Class<?> tClass = Class.forName("java.lang.Class"

JAVA反射系列之Field,java.lang.reflect.Field使用获取方法

JAVA反射系列之Field,java.lang.reflect.Field使用获取方法.   转载https://my.oschina.net/u/1407116/blog/209383 摘要 java.lang.reflect.Field使用 Field. 首先必须明一点 Field类主要是用来辅助获取和操作类的属性的! 1.怎么通过反射获取类的属性 先来看JDK提供的方法有如下几种: a)Class.getDeclaredField(String name);      返回一个 Fiel

Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别(转)

一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:  其中 i.加载是指将编译后的java类文件(也就是.class文件)中的二进制数据读入内存,并将其放在运行时数据区的方法区内,然后再堆区创建一个Java.lang.Class对象,用来封装类在方法区的数据结构.即加载后最终得到的是Class对象,并且更加值得注意的是:该Java.lang.Class对象是单实例的,无论这个类创建了多少个对象,他的Class对象时唯一的!!!!.