zoukankan      html  css  js  c++  java
  • 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 }
    View Code

    控台中反射获取信息代码(控台引用类库项目,也可以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 }

    下一篇讲如何调用方法。

    很多年以后,我有个名字叫西毒……
  • 相关阅读:
    POJ1251 Jungle Roads 【最小生成树Prim】
    聪明的kk
    日积月累:weightSum和layout_weight属性合用
    ubuntu 下舒畅的使用libreoffice
    maple 教程
    龙、虎、鲸书杂谈
    百度没出新算法之前这样的最好的的优化方案
    DWR入门实例(二)
    Android应用公布的准备——生成渠道包
    leetcode第一刷_Spiral Matrix II
  • 原文地址:https://www.cnblogs.com/xidu/p/4262663.html
Copyright © 2011-2022 走看看