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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 甘家利 中级黑马   /  2013-2-21 21:39  /  1065 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

反射实际上就是为得到程序集中的属性和方法。今晚并制作测试程序与大家分享,也请批评指正
程序集SomeSports.dll的源文件如下所示。
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;
    }
}
public class Hockey : Sport
{
    public Hockey()
    {
        name = "Hockey";
    }
    public override string GetDuration()
    {
        return "three 20 minute periods";
    }
    public override string GetName()
    {
        return name;
    }
}
public class Soccer : Sport
{
    public Soccer()
    {
        name = "Soccer";
    }
    public override string GetDuration()
    {
        return "two 45 minute halves";
    }
    public override string GetName()
    {
        return name;
    }
}
上述代码中的父类Sport代码如下所示。
using System;
public abstract class Sport
{
    protected string name;
    public abstract string GetDuration();
    public abstract string GetName();
}
在生成程序集SomeSport.dll后,反过来想知道这个程序集中有哪些类,以及想知道如何调用程序集中某类对象的方法时,大致步骤如下。
1. 导入using System.Reflection;
2. Assembly.Load("程序集")加载程序集,返回类型是一个Assembly
3. foreach (Type type in assembly.GetTypes())
   {
        string t = type.Name;
   }
   得到程序集中所有类的名称
4. Type type = assembly.GetType("程序集.类名");获取当前类的类型
5. Activator.CreateInstance(type); 创建此类型实例
6. MethodInfo mInfo = type.GetMethod("方法名");获取当前方法
7. mInfo.Invoke(null,方法参数);
根据上述步骤,制作测试代码如下所示。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            Assembly assembly1 = Assembly.LoadFrom("SomeSports.dll");
            string t = "";
            foreach (Type type1 in assembly1.GetTypes())
            {
                t = type1.Name;
                Console.WriteLine(t);
            }
            if (t != null)
            {
                Type type = assembly1.GetType(t);//获取当前类的类型
                Object dynamicObject = Activator.CreateInstance(type); //创建此类型实例
                MethodInfo mInfo = type.GetMethod("GetDuration");//获取当前方法
                string s = (string)mInfo.Invoke(dynamicObject, null);
                Console.WriteLine(s);
            }
            Console.ReadKey();
        }
    }
}

评分

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

查看全部评分

1 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马