最近想做一个插件式的软件给公司的监控用,初步的想法是使用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 = ;
  13. Height = ;
  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 = ;//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 += ;
  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 + ) + "参数名:" + parameterInfo.Name + ", 参数类型:" +
  34. parameterInfo.ParameterType.FullName);
  35. }
  36. }
  37. count = ;
  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 += ;
  49. Console.WriteLine("The "+count+"st field is"+fieldInfo.Name+", type is "+fieldInfo.FieldType);
  50. }
  51. count = ;
  52.  
  53. //获取接口信息
  54. var ifaces = personType.GetInterfaces();
  55. Console.WriteLine(personType.FullName + " has " + ifaces.Count() + " interfaces.");
  56.  
  57. //获取成员信息
  58. var members = personType.GetMembers();
  59. Console.WriteLine(personType.FullName+" has "+members.Count()+" members.");
  60. foreach (var memberInfo in members)
  61. {
  62. count += ;
  63. Console.WriteLine("The " + count + "st member name is " + memberInfo.Name + ", type is " +
  64. memberInfo.ReflectedType);
  65. }
  66. count = ;
  67.  
  68. //获取方法信息
  69. var methods = personType.GetMethods();
  70. Console.WriteLine(personType.FullName+" has "+methods.Count()+" methods.");
  71. foreach (var methodInfo in methods)
  72. {
  73. count += ;
  74. var paramInfos = methodInfo.GetParameters();
  75. Console.WriteLine("The " + count + "st method is " + methodInfo.Name + ", return type is " +
  76. methodInfo.ReturnType + ", param count is " + paramInfos.Count());
  77.  
  78. Console.WriteLine(paramInfos.Any() ? "参数列表:" : "无参数。");
  79. foreach (var parameterInfo in paramInfos)
  80. {
  81. Console.WriteLine("param name:" + parameterInfo.Name + ", param type: " +
  82. parameterInfo.ParameterType);
  83. }
  84. }
  85. count = ;
  86.  
  87. //propertites
  88. var pros = personType.GetProperties();
  89. Console.WriteLine(personType.FullName+" has "+pros.Count()+ "public properties.");
  90.  
  91. Console.ReadKey();
  92. }
  93. }
  94. }

下一篇讲如何调用方法。

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

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

    一.简介 java.lang.reflect包提供了用于获取类和对象的反射信息的类和接口.反射API允许对程序访问有关加载类的字段,方法和构造函数的信息进行编程访问.它允许在安全限制内使用反射的字段, ...

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

    一.简介 java.lang.reflect包提供了用于获取类和对象的反射信息的类和接口.反射API允许对程序访问有关加载类的字段,方法和构造函数的信息进行编程访问.它允许在安全限制内使用反射的字段, ...

  3. Java中反射的三种常用方式

    Java中反射的三种常用方式 package com.xiaohao.test; public class Test{ public static void main(String[] args) t ...

  4. C#中反射接受的字符串需要满足的Backus-Naur Form语法

    MSDN的Specifying Fully Qualified Type Names指明了C#中反射接受的字符串需要满足如下的Backus-Naur Form语法. BNF grammar of fu ...

  5. .NET中反射机制的使用与分析

    .NET中反射机制的使用与分析 [日期:2008-06-30] 来源:  作者:志伟     .NET反射的定义:审查元数据并收集关于它的类型信息的能力. 元数据是一种二进制信息,用以对存储在公共语言 ...

  6. java中反射学习整理

    转载请注明:http://blog.csdn.net/j903829182/article/details/38405735 反射主要是指程序能够訪问.检測和改动它本身的状态或行为的一种能力. jav ...

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

    反射调用返回复杂对象的.NET方法 定义数据接口 上一篇在C++中反射调用.NET(一)中,我们简单的介绍了如何使用C++/CLI并且初步使用了反射调用.NET程序集的简单方法,今天我们看看如何在C+ ...

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

    为什么要在C++中调用.NET 一般情况下,我们常常会在.NET程序中调用C/C++的程序,使用P/Invoke方式进行调用,在编写代码代码的时候,首先要导入DLL文件,然后在根据C/C++的头文件编 ...

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

    在.NET与C++之间传输集合数据 上一篇<在C++中反射调用.NET(二)>中,我们尝试了反射调用一个返回DTO对象的.NET方法,今天来看看如何在.NET与C++之间传输集合数据. 使 ...

  10. Java中反射的实现方式

    所谓反射,是指在运行时状态中,获取类中的属性和方法,以及调用其中的方法的一种机制.这种机制的作用在于获取运行时才知道的类(Class)及其中的属性(Field).方法(Method)以及调用其中的方法 ...

随机推荐

  1. Java API ——包装类

    1.包装类的概述 · 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据. · 常用的操作之一:用于基本数据类型与字符串之间的转换. · 基本类型和包装类的对应 为了对基本数据 ...

  2. Java API ——Scanner类

    1.Scanner类概述 JDK5以后用于获取用户的键盘输入,一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器.Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空 ...

  3. bugumongo--ConnectToMongoDB

    连接MongoDB 在能够对MongDB进行操作之前,需要使用BuguConnection连接到MongoDB数据库.代码如下: BuguConnection conn = BuguConnectio ...

  4. dom4j解析器 基于dom4j的xpath技术 简单工厂设计模式 分层结构设计思想 SAX解析器 DOM编程

    *1 dom4j解析器   1)CRUD的含义:CreateReadUpdateDelete增删查改   2)XML解析器有二类,分别是DOM和SAX(simple Api for xml).     ...

  5. CodePage------Encoding 类支持的编码以及与这些编码关联的代码页(CodePage)

    Encoding 类 .NET Framework 4  表示字符编码. 继承层次结构 System.Object  System.Text.Encoding    System.Text.ASCII ...

  6. BZOJ_1031_[JSOI2007]_字符串加密_(后缀数组)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1031 长度为n的字符串形成环,枚举开头位置,得到n个长度为n的串,将这些串排序,然后按照顺序输 ...

  7. I.MX6 build.prop

    /************************************************************************ * I.MX6 build.prop * 说明: * ...

  8. 优秀it博客和文章

    优秀博客 综合 杨文博(供职于百度公司,任复合搜索部资深研发工程师,目前作为tech lead,负责垂直行业搜索后端架构研发.) 杨远骋 徐宥(Google 软件工程师. 这个中文博客是我的思考记录, ...

  9. Selenium2Library系列 keywords 之 _SelectElementKeywords 之 get_list_items(self, locator)

    def get_list_items(self, locator): """Returns the values in the select list identifie ...

  10. gem install走代理,速度刚刚的

    有个树莓pi,安装了shadowsocks 和 cow ,做代理,走ipv6,学校不收ipv6流量钱.速度也不错,快的下载可达10M/s. gem install xx遇到墙了. nano ~/.ge ...