.NET 提供了哪些类型来实现反射
实现反射的类型大多数都定义在 System.Reflection
命名空间之下。
Assembly
:定义一个 Assembly,它是可重用、无版本冲突并且可自我描述的公共语言运行库应用程序构造块。AssemblyName
:完整描述程序集的唯一标识EventInfo
:发现事件的属性(Attribute)并提供对事件元数据的访问权FieldInfo
:发现字段属性(Attribute)并提供对字段元数据的访问权LocalVariableInfo
:发现局部变量的属性,并提供对局部变量元数据的访问ManifestResourceInfo
:包含清单资源拓扑信息MemberInfo
:获取有关成员属性的信息,并提供对成员元数据的访问MethodBase
:提供有关方法和构造函数的信息MethodBody
:提供对用于方法体的元数据和 MSIL 的访问Module
:在模块上执行反射ParameterInfo
:发现参数属性(Attribute)并提供对参数元数据的访问PropertyInfo
:发现属性(Property)的属性(Attribute)并提供对属性(Property)元数据的访问
示例
点击查看代码
csharp
using System;
using System.Reflection;
namespace UseReflection
{
partial class UseReflection
{
/// <summary>
/// 分析程序集
/// </summary>
/// <param name="assembly"></param>
private static void AnalyzeAssembly(Assembly assembly)
{
// 打印程序集的名称
Console.WriteLine("程序集名字:" + assembly.FullName);
// 打印程序集的位置
Console.WriteLine("程序集位置:" + assembly.Location);
// 打印程序集是否存在于 GAC 中
Console.WriteLine("程序集是否存在于 GAC 中:" + assembly.GlobalAssemblyCache.ToString());
// 打印包含程序集清单的模块名单
Console.WriteLine("包含程序集清单的模块:", assembly.ManifestModule.Name);
// 打印程序集的 CLR 版本
Console.WriteLine("运行程序集需要的 CLR 版本:", assembly.ImageRuntimeVersion);
Console.WriteLine("现在开始分析引用的程序集");
Module modules = assembly.GetModules();
foreach (Module module in modules)
{
AnalyzeModule(module);
}
}
/// <summary>
/// 分析模块
/// </summary>
/// <param name="module"></param>
private static void AnalyzeModule(Module module)
{
Console.WriteLine("模块名:" + module.Name);
Console.WriteLine("模块的 UUID:" + module.ModuleVersionId);
Console.WriteLine("开始分析模块下的类型");
Type types = module.GetTypes();
foreach (Type type in types)
{
AnalyzeType(type);
}
}
/// <summary>
/// 分析类型
/// </summary>
/// <param name="type"></param>
private static void AnalyzeType(Type type)
{
Console.WriteLine("类型名字:" + type.Name);
Console.WriteLine("类型的类别:" + type.Attributes);
if (type.BaseType != null)
{
Console.WriteLine("类型的基类是:" + type.BaseType.Name);
}
Console.WriteLine("类型的 GUID:" + type.GUID);
// 设置感兴趣的类型成员
BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
// 分析成员
FieldInfo fields = type.GetFields(flags);
if (fields.Length > 0)
{
Console.WriteLine("开始分析类型的成员");
foreach (FieldInfo field in fields)
{
AnalyzeField(field);
}
}
// 分析包含的方法
MethodInfo methods = type.GetMethods(flags);
if (methods.Length > 0)
{
Console.WriteLine("开始分析类型的方法");
foreach (MethodInfo method in methods)
{
AnalyzeMethod(method);
}
}
// 分析属性
PropertyInfo properties = type.GetProperties(flags);
if (properties.Length > 0)
{
Console.WriteLine("开始分析类型的属性");
foreach (PropertyInfo property in properties)
{
AnalyzeProperty(property);
}
}
}
/// <summary>
/// 分析成员
/// </summary>
/// <param name="field"></param>
private static void AnalyzeField(FieldInfo field)
{
Console.WriteLine("成员名字:" + field.Name);
Console.WriteLine("成员的类别:" + field.Attributes);
Console.WriteLine("成员的类型名:" + field.FieldType.Name);
}
/// <summary>
/// 分析方法
/// </summary>
/// <param name="method"></param>
private static void AnalyzeMethod(MethodInfo method)
{
Console.WriteLine("方法名字:" + method.Name);
Console.WriteLine("方法的类别:" + method.Attributes);
Console.WriteLine("开始分析方法的参数");
ParameterInfo parameters = method.GetParameters();
if (parameters.Length <= 0)
{
Console.WriteLine("方法没有参数");
}
foreach (ParameterInfo parameter in parameters)
{
AnalyzeParameter(parameter);
}
Console.WriteLine("分析方法的返回参数");
ParameterInfo retpar = method.ReturnParameter;
AnalyzeParameter(retpar);
}
/// <summary>
/// 分析方法参数
/// </summary>
/// <param name="parameter"></param>
private static void AnalyzeParameter(ParameterInfo parameter)
{
Console.WriteLine("参数名字:" + parameter.Name);
Console.WriteLine("参数的类别:" + parameter.Attributes);
Console.WriteLine("参数的类型:" + parameter.ParameterType.Name);
}
/// <summary>
/// 分析属性
/// </summary>
/// <param name="property"></param>
private static void AnalyzeProperty(PropertyInfo property)
{
Console.WriteLine("属性名字:" + property.Name);
Console.WriteLine("属性的类别:" + property.Attributes);
Console.WriteLine("是否可读:" + property.CanRead.ToString());
Console.WriteLine("是否可写:" + property.CanWrite.ToString());
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
入口方法
点击查看代码
csharp
using System;
using System.Reflection;
using System.Security.Permissions;
namespace UseReflection
{
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
partial class UseReflection
{
static void Main(string args)
{
Assembly assembly = Assembly.LoadFrom(@"..\..\..\..\SimpleAssembly\SimpleAssembly\bin\Debug\SimpleAssembly.exe");
AnalyzeAssembly(assembly);
// 创建一个程序集中的类型的对象
// 这里尝试创建 SimpleAssembly 对象
Console.WriteLine("利用反射创建类型");
string pars = { "测试反射" };
object o = assembly.CreateInstance(assembly.GetModules()[0].GetTypes()[0].ToString(), true, BindingFlags.CreateInstance, null, pars, null, null);
Console.WriteLine(o);
Console.Read();
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24