您的位置:首页 > 其它

利用反射技术获取当前程序集指定类型的信息

2010-09-08 12:17 633 查看
获取指定类型的信息,只需获取该类型的Type对象,然后调用其成员即可.

以下调用类ClassB的静态方法Ref(),用户输入不同值,反射不同类型的信息.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

//导入相应命名空间
using System.Reflection;
namespace MethodRef2
{
    class ClassRef
    {
        static void Main(string[] args)
        {
            while (true)
            {
                Console.Write("请输入检测类型名称:");

                //接收用户输入
                string strInput = Console.ReadLine();
                //如果输入quit则退出
                if (strInput == "quit")
                {
                    break;
                }
                try
                {
                    Type tp = Type.GetType(strInput, false, false);
                    ClassB.Ref(tp);
                }
                catch (NullReferenceException e)
                {
                    //捕获空对象引用异常并输出
                    Console.WriteLine("异常信息:{0}", e.Message);
                }
                catch (Exception e)
                {
                    //捕获一般异常并输出
                    Console.WriteLine("异常信息:{0}", e.Message);
                }
            }

        }
    }
    //定义两个接口
    public interface IClassA
    {
        string MethodA(string s);
    }
    public interface IClassB
    {
        string Name
        {
            get;
        }
    }
    //定义类ClassA,实现接口IClassA和IClassB
    class ClassA:IClassA,IClassB
    {
        //定义数据成员(field)为_name
        public string _name;

        //定义成员属性(property)为Name
        public string Name
        {
            get
            {
                return _name;
                
            }
        }

        //实现接口的方法MethodA
        public string MethodA(string s)
        {
            _name = s;
            return _name;
        }

        //定义public权限的方法
        public void MethodB(string s)
        {
            Console.WriteLine("方法MethodB()接收的参数是:{0}", s);
        }
        public override string ToString()
        {
            return "ClassA类的对象";
        }
    }
    class ClassB
    {
        string _name;
        internal string MethodB(string s)
        {
            _name = s;
            return _name;
        }

        //接受一个Type类型参数
        public static void Ref(Type tp)
        {
            //输出Type对象的基本属性,输出类本身的属性信息
            Console.WriteLine("/n类名:{0}", tp.FullName);           
            Console.WriteLine("此类是否为泛型:{0}",tp.IsGenericType);
            Console.WriteLine("此类是否为接口:{0}",tp.IsInterface);
            Console.WriteLine("此类是否为类类型:{0}", tp.IsClass);
            Console.WriteLine("此类是否为COM对象:{0}", tp.IsCOMObject);
            Console.WriteLine("此类是否为public访问类型:{0}", tp.IsPublic);
            Console.WriteLine("此类是否为密封类型:{0}", tp.IsSealed);
            Console.WriteLine("此类是否为值类型:{0}", tp.IsValueType);

            //获取Type对象的所有公共成员并存入arrMI数组中
            MemberInfo[] arrMI = tp.GetMembers();
            //遍历所有成员
            foreach (MemberInfo m in arrMI)
            {
                Console.WriteLine("/t成员类型:{0},名称:{1}", m.MemberType, m.Name);
            }

            //获取Type对象所支持的接口并存入arrItp数组中
            Type[] arrItp = tp.GetInterfaces();
            if (arrItp.Length != 0)
            {
                foreach (Type t in arrItp)
                {
                    Console.WriteLine("{0}实现的接口类型{1}", tp.FullName, t.FullName);
                }
            }
            else
            {
                Console.WriteLine("{0}不实现任何接口类型", tp.FullName);
            }
        }
    }
}




1、输入ClassA后,输出ClassA类的详细信息
请输入检测类型名称:ClassA
异常信息:未将对象引用设置到对象的实例。 (错误原因需要指定命名空间)
请输入检测类型名称:MethodRef2.ClassA
类名:MethodRef2.ClassA
此类是否为泛型:False
此类是否为接口:False
此类是否为类类型:True
此类是否为COM对象:False
此类是否为public访问类型:False
此类是否为密封类型:False
此类是否为值类型:False
成员类型Method,名称get_Name
成员类型Method,名称MethodA
成员类型Method,名称MethodB
成员类型Method,名称ToString
成员类型Method,名称Equals
成员类型Method,名称GetHashCode
成员类型Method,名称GetType
成员类型Constructor,名称.ctor
成员类型Property,名称Name
成员类型Field,名称_name
MethodRef2.ClassA实现的接口类型MethodRef2.IClassA
MethodRef2.ClassA实现的接口类型MethodRef2.IClassB



2、输入ClassB后,输出ClassB类的详细信息

请输入检测类型名称:MethodRef2.ClassB
类名:MethodRef2.ClassB
此类是否为泛型:False
此类是否为接口:False
此类是否为类类型:True
此类是否为COM对象:False
此类是否为public访问类型:False
此类是否为密封类型:False
此类是否为值类型:False
成员类型Method,名称Ref
成员类型Method,名称ToString
成员类型Method,名称Equals
成员类型Method,名称GetHashCode
成员类型Method,名称GetType
成员类型Constructor,名称.ctor
MethodRef2.ClassB不实现任何接口类型



3、输入IClassA后,输出IClassA类的详细信息

请输入检测类型名称:MethodRef2.IClassA
类名:MethodRef2.IClassA
此类是否为泛型:False
此类是否为接口:True
此类是否为类类型:False
此类是否为COM对象:False
此类是否为public访问类型:True
此类是否为密封类型:False
此类是否为值类型:False
成员类型Method,名称MethodA
MethodRef2.IClassA不实现任何接口类型



4、输入IClassB后,输出IClassB类的详细信息

请输入检测类型名称:MethodRef2.IClassB
类名:MethodRef2.IClassB
此类是否为泛型:False
此类是否为接口:True
此类是否为类类型:False
此类是否为COM对象:False
此类是否为public访问类型:True
此类是否为密封类型:False
此类是否为值类型:False
成员类型Method,名称get_Name
成员类型Property,名称Name
MethodRef2.IClassB不实现任何接口类型



5、输入基类库System.Int32后,输出System.Int32类的详细信息

请输入检测类型名称:System.Int32
类名:System.Int32
此类是否为泛型:False
此类是否为接口:False
此类是否为类类型:False
此类是否为COM对象:False
此类是否为public访问类型:True
此类是否为密封类型:True
此类是否为值类型:True
成员类型:Method,名称:CompareTo
成员类型:Method,名称:CompareTo
成员类型:Method,名称:Equals
成员类型:Method,名称:Equals
成员类型:Method,名称:GetHashCode
成员类型:Method,名称:ToString
成员类型:Method,名称:ToString
成员类型:Method,名称:ToString
成员类型:Method,名称:ToString
成员类型:Method,名称:Parse
成员类型:Method,名称:Parse
成员类型:Method,名称:Parse
成员类型:Method,名称:Parse
成员类型:Method,名称:TryParse
成员类型:Method,名称:TryParse
成员类型:Method,名称:GetTypeCode
成员类型:Method,名称:GetType
成员类型:Field,名称:MaxValue
成员类型:Field,名称:MinValue
System.Int32实现的接口类型System.IComparable
System.Int32实现的接口类型System.IFormattable
System.Int32实现的接口类型System.IConvertible
System.Int32实现的接口类型System.IComparable`1[[System.Int32, mscorlib, Version=
2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
System.Int32实现的接口类型System.IEquatable`1[[System.Int32, mscorlib, Version=2
.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: