A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wenbolwm 黑马帝   /  2012-3-12 14:28  /  1417 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请讲解下c#中的反射,用通俗易懂的,不要书一那种,谢谢了。

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

2 个回复

倒序浏览
1、可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型
2、应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射。
3、反射主要应用与类库,这些类库需要知道一个类型的定义,以便提供更多的功能。

与工厂模式的联系:
利用反射,在配置文件里定义好类型名,在程序运行时动态创建对象。调高了灵活性,但会有性能损失


工厂方法+反射:
using System;
using System.Collections.Generic;
using System.Text;

namespace FactoryMethod
{
    abstract class AbstractCar
    {
       public abstract void StartUp();
       public abstract void Run();
       public abstract void Turn();
       public abstract void Stop();

    }
    abstract class AbstractCarFactory
    {
        public abstract AbstractCar CreateCar();

    }
    class DongFengCarFactory : AbstractCarFactory
    {

        public override AbstractCar CreateCar()
        {
            return new DongfengCar();
        }
    }
    class HongQiCarFactory : AbstractCarFactory
    {
        public override AbstractCar CreateCar()
        {
            return new HongQiCar();
        }
    }
    class DongfengCar : AbstractCar
    {

        public override void StartUp()
        {

        }

        public override void Run()
        {

        }

        public override void Turn()
        {

        }

        public override void Stop()
        {

        }
    }
    class HongQiCar : AbstractCar
    {
        public override void StartUp()
        {

        }

        public override void Run()
        {

        }

        public override void Turn()
        {

        }

        public override void Stop()
        {

        }
    }
    class CarTestFrameWork
    {
        AbstractCar car;
        public void BuildTesetContext(AbstractCarFactory abstractCarFactory)
        {
            car = abstractCarFactory.CreateCar();
        }
        public void DoTest()
        {
            Console.WriteLine("Test " + car.ToString() + " car!");
        }
        public void GetData()
        {

        }
    }
//这个类里使用了反射
    class Program
    {
        static void Main(string[] args)
        {
            CarTestFrameWork carTestFrameWork = new CarTestFrameWork();

            String strCarFactory = "FactoryMethod." + ConfigurationSettings.AppSettings["CarFactory"];
            string carFactoryType = "";
            AbstractCarFactory carFactory;
            carFactory = Assembly.Load("FactoryMethod").CreateInstance(strCarFactory) as AbstractCarFactory;
            carTestFrameWork.BuildTesetContext(carFactory);
            carTestFrameWork.DoTest();
            Console.ReadLine();
        }
    }
}
配置文件定义:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="CarFactory" value="DongFengCarFactory"/>
  </appSettings>
</configuration>
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马