zoukankan      html  css  js  c++  java
  • 关于C#反射机制,来源于网络

    反射是种机制,通过这种机制我们可以知道一个未知类型的类型信息,比如,有一个对象a,这个对象不是我们定义的,也许是通过网络捕捉到的,也许是使用泛型定义的,但我们想知道这个对象的类型信息,想知道这个对象有哪些方法或者属性什么的.甚至我们想进一步调用这个对象的方法.关键是现在我们只知道它是一个对象,不知道它的类型,自然不会知道它有哪些方法等信息.这时我们该怎么办?反射机制就是解决这么一个问题的.通过反射机制我们可以知道未知类型对象的类型信息.

    再比如,我们有一个dll文件 ,我们想调用里面的类.现在假设这个dll文件 的类的定义,数量等不是固定的,是经常变化的.也许某一天你要在这个dll里面增加一个类定义.也许是说即使改变了dll文件 的定义也不需要改变我们的程序集.这时候 我们就会使用一个未知dll.我们该怎么办?同样,反射机制帮助了我们,我们可以通过反射来实现.说白了,反射就是能知道我们未知类型的类型信息这么一个东西.没什么 神秘可讲.

    下面我们来举一个例子.例子的思路是这样的:我们有一个dll.该dll里面有许多关于运动的类.每一个类记录了一种体育运动的信息.我们在另处一个程序里面要知道这个dll的信息:

    //第一步:我们在VS中新建一个类库,新建一个抽象类Sport内容如下
    using System;
    public abstract class Sport
    {
    protected string name;
    public abstract string GetDuration();
    public abstract string GetName();
    }
    //编译第二步:在新建一个类库,这个类库生成的dll就那未知的dll文件,不过要引用第一步生成的dll文件,也就是抽象类Sport,暂时新建3个类内容如下:
    using System;
    public class Football:Sport
    {
    public Football()
    {
    name
    = "Football";
    }
    public override string GetDuration()
    {
    return "four 15 minute quarters";
    }
    public override string GetName()
    {
    return name;
    }
    }

    using System;
    public class Hockey:Sport
    {
    public Hockey()
    {
    name
    = "Hockey";
    }
    public override string GetDuration()
    {
    return "three 20 minute periods";
    }
    public override string GetName()
    {
    return name;
    }
    }
    using System;
    public class Soccer:Sport
    {
    public Soccer()
    {
    name
    = "Soccer";
    }
    public override string GetDuration()
    {
    return "two 45 minute halves";
    }
    public override string GetName()
    {
    return name;
    }
    }



    public class Progrom
    {
    public static void Main(string[] args)
    {

    Console.Clear();
    int i, j;
    Assembly assembly
    = Assembly.LoadFile("反射Demo实体类.dll");
    Type[] types
    = assembly.GetTypes();
    Console.WriteLine(assembly.GetName().Name
    + "contains the following types");

    for (i = 0; i < types.GetLength(0); ++i)
    {
    Console.WriteLine(
    "\r(" + i + ") " + types[i].Name);
    }
    i
    = types.Length - 1;
    Console.Write(
    "make selection(0-" + i + ");");

    j
    = Convert.ToInt32(Console.ReadLine());
    Console.WriteLine();

    if (types[j].IsSubclassOf(typeof(Sport)))
    {
    ConstructorInfo ci
    = types[j].GetConstructor(new Type[0]);
                       Sport sport = (Demo)ci.Invoke(new Object[0]);

    Console.WriteLine(sport.GetName()
    + " has " + sport.GetDuration());
    }
    else
    {
    Console.WriteLine(types[j].Name
    + " is not a sub-class of Sport");
    }

    }
    }
  • 相关阅读:
    [Swift实际操作]七、常见概念-(5)使用NSString对字符串进行各种操作
    [Swift]LeetCode326. 3的幂 | Power of Three
    [Swift]LeetCode303. 区域和检索
    [Swift]LeetCode292. Nim游戏 | Nim Game
    [Swift]LeetCode290. 单词模式 | Word Pattern
    SpringMVC框架中的异常解析器-ExceptionHandler和HandlerExceptionResolver
    一个Web报表项目的性能分析和优化实践(七):性能监测工具JavaMelody
    一个Web报表项目的性能分析和优化实践(七):性能监测工具JavaMelody
    百度Echarts-免费的商业产品图表库
    百度Echarts-免费的商业产品图表库
  • 原文地址:https://www.cnblogs.com/yannis/p/2056420.html
Copyright © 2011-2022 走看看