C# 反射实例Ⅰ↖(^ω^)↗

动态创建对象实例【经典】
是实现抽象工厂的基础,也是实现抽象工厂的核心技术,通过它,可以动态创建一个你想要的对象.如下面的例子是演示如何动态创建ChineseName或EnglishName的实例

 1using System;
2
using System.Reflection;
3
namespace TestReflection
4{
5 class AXzhz_sReflectionExample
6 {
7 public static void Main()
8 {
9 IName name=AbstractFactory.GetName();
10 name.ShowName();
11 }
12 }
13
14 public class AbstractFactory
15 {
16 public static IName GetName()
17 {
18 //s的值以后从Web.config动态获取
19 //把s赋值为:TestReflection.EnglishName,将显示英文名
20 string s = "TestReflection.ChineseName";
21 IName name = (IName)Assembly.Load("TestReflection").CreateInstance(s);
22 return name;
23 }
24 }
25
26 //声明一个接口,它有一个显示"名字"的功能
27 public interface IName
28 {
29 void ShowName();
30 }
31
32 //实现接口,显示中国名字
33 public class ChineseName : IName
34 {
35 public void ShowName()
36 {
37 Console.WriteLine("我叫AX!");
38 Console.ReadLine();
39 }
40 }
41
42 //实现接口,显示英国名字
43 public class EnglishName:IName
44 {
45 void IName.ShowName()
46 {
47 Console.WriteLine("My name is AXzhz!");
48 Console.ReadLine();
49 }
50 }
51}

  获得整个解决方案的所有Assembly(这个有点用)

如果你不太清楚自己的解决方案中都用到了哪些Assembly,可以使用下面的方法

1using System;
2
using System.Reflection;
3
4
namespace TestReflection
5{
6 class ShowAllAssembly
7 {
8 public static void Main()
9 {
10 //获得解决方案的所有Assembly
11 Assembly[] AX = AppDomain.CurrentDomain.GetAssemblies();
12 //遍历显示每个Assembly的名字
13 foreach (object var in AX)
14 {
15 Console.WriteLine("Assembly的名字:"+var.ToString());
16 }
17 //使用一个已知的Assembly名称,来创建一个Assembly
18 //通过CodeBase属性显示最初指定的程序集的位置
19 Console.WriteLine("最初指定的程序集TestReflection的位置:" + Assembly.Load("TestReflection").CodeBase);
20 Console.ReadLine();
21 }
22 }
23}
24

  如果再想得到Assembly里的信息

1using System;
2
using System.Reflection;
3
namespace TestReflection
4{
5 class Program
6 {
7 public static void Main(string[] args)
8 {
9 object A = new AX();
10 //获取对象所属的Assembly的所有类的基本信息
11 new TestObjectType().TestObjectTypeNow(A);
12 }
13 }
14
15 class AX
16 {
17 internal int kkkkkkkk = 0;
18 public int ooooooooo;
19 private int property;
20
21 public int Property
22 {
23 get { return property; }
24 set { property = value; }
25 }
26 public void A()
27 {
28 Console.WriteLine("AX's function!~");
29 }
30 }
31
32 class AXzhz
33 {
34 }
35
36 class TestObjectType
37 {
38 //构造函数的默认修饰为private
39 internal void TestObjectTypeNow(object A)
40 {
41 Type tpA = A.GetType();
42 Assembly assembly = tpA.Assembly;
43 Type[] types = assembly.GetTypes();
44 foreach (Type type in types)
45 {
46 Console.WriteLine("【类名】"+type.FullName);
47 //获取类型的结构信息
48 ConstructorInfo[] myconstructors = type.GetConstructors();
49 Show(myconstructors);
50 //获取类型的字段信息
51 FieldInfo[] myfields = type.GetFields();
52 Show(myfields);
53 //获取方法信息
54 MethodInfo[] myMethodInfo = type.GetMethods();
55 Show(myMethodInfo);
56 //获取属性信息
57 PropertyInfo[] myproperties = type.GetProperties();
58 Show(myproperties);
59 //获取事件信息,这个项目没有事件,所以注释掉了,
60 //通过这种办法,还可以获得更多的type相关信息.
61 //EventInfo[] Myevents = type.GetEvents();
62 //Show(Myevents);
63 }
64 Console.ReadLine();
65 }
66 //显示数组的基本信息
67 public void Show(object[] os)
68 {
69 foreach (object var in os)
70 {
71 Console.WriteLine(var.ToString());
72 }
73 Console.WriteLine("----------------------------------");
74 }
75 }
76}

  


转载于:https://www.cnblogs.com/Tammie/archive/2011/09/09/2172630.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值