利用反射技术获取当前程序集指定类型的信息
2010-09-08 12:17
633 查看
获取指定类型的信息,只需获取该类型的Type对象,然后调用其成员即可.
以下调用类ClassB的静态方法Ref(),用户输入不同值,反射不同类型的信息.
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]]
以下调用类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]]
相关文章推荐
- 动态加载外部程序集并用反射获取指定类型的信息
- 使用反射技术获取指定类型中方法的完整信息
- 黑马程序员--Java基础加强--14.利用反射操作泛型III【解析关于泛型类型的细节信息的获取方法】【Method与泛型相关的方法】【个人总结】
- c#反射机制学习和利用反射获取类型信息
- c#反射机制学习和利用反射获取类型信息
- C#利用反射动态调用DLL并返回结果,和获取程序集的信息
- c#反射机制学习和利用反射获取类型信息
- c#反射机制学习和利用反射获取类型信息
- 【转】NET中反射实现 可空类型 与基础类型的转换 以及获取指定属性的大小问题
- 利用.net反射动态调用指定程序集的中的方法
- 利用.net反射动态调用指定程序集的中的方法
- 利用.net反射动态调用指定程序集的中的方法
- C#反射 获取程序集信息和通过类名创建类实例
- [原创]利用爬虫技术获取网页数据,以及想要的指定数据
- 利用.net反射动态调用指定程序集的中的方法
- java使用poi导出excel的内容,同时可以利用反射进行动态获取信息
- C#反射 获取程序集信息和通过类名创建类实例
- 利用java反射技术提取类信息
- 如何使用反射技术获取泛型类的真实类型?
- java基础-反射2(反射,反射操作对象,Class对象的使用,类型信息的获取)