黑马程序员技术交流社区

标题: 使用C#反射 [打印本页]

作者: 甘家利    时间: 2013-2-21 21:39
标题: 使用C#反射
反射实际上就是为得到程序集中的属性和方法。今晚并制作测试程序与大家分享,也请批评指正
程序集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();
        }
    }
}

作者: 许庭洲    时间: 2013-2-22 14:21
值得学习ing!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2