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
|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
/*============================================================
**
**
**
**
**
** ParameterBuilder is used to create/associate parameter information
**
**
===========================================================*/
namespace System.Reflection.Emit {
using System.Runtime.InteropServices;
using System;
using System.Reflection;
using System.Diagnostics.Contracts;
public class ParameterBuilder
{
// Set the default value of the parameter
public virtual void SetConstant(Object defaultValue)
{
TypeBuilder.SetConstantValue(
m_methodBuilder.GetModuleBuilder(),
m_pdToken.Token,
m_iPosition == 0 ? m_methodBuilder.ReturnType : m_methodBuilder.m_parameterTypes[m_iPosition - 1],
defaultValue);
}
// Use this function if client decides to form the custom attribute blob themselves
public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute)
{
if (con == null)
throw new ArgumentNullException(nameof(con));
if (binaryAttribute == null)
throw new ArgumentNullException(nameof(binaryAttribute));
Contract.EndContractBlock();
TypeBuilder.DefineCustomAttribute(
m_methodBuilder.GetModuleBuilder(),
m_pdToken.Token,
((ModuleBuilder )m_methodBuilder.GetModule()).GetConstructorToken(con).Token,
binaryAttribute,
false, false);
}
// Use this function if client wishes to build CustomAttribute using CustomAttributeBuilder
public void SetCustomAttribute(CustomAttributeBuilder customBuilder)
{
if (customBuilder == null)
{
throw new ArgumentNullException(nameof(customBuilder));
}
Contract.EndContractBlock();
customBuilder.CreateCustomAttribute((ModuleBuilder) (m_methodBuilder .GetModule()), m_pdToken.Token);
}
//*******************************
// Make a private constructor so these cannot be constructed externally.
//*******************************
private ParameterBuilder() {}
internal ParameterBuilder(
MethodBuilder methodBuilder,
int sequence,
ParameterAttributes attributes,
String strParamName) // can be NULL string
{
m_iPosition = sequence;
m_strParamName = strParamName;
m_methodBuilder = methodBuilder;
m_strParamName = strParamName;
m_attributes = attributes;
m_pdToken = new ParameterToken( TypeBuilder.SetParamInfo(
m_methodBuilder.GetModuleBuilder().GetNativeHandle(),
m_methodBuilder.GetToken().Token,
sequence,
attributes,
strParamName));
}
public virtual ParameterToken GetToken()
{
return m_pdToken;
}
public virtual String Name {
get {return m_strParamName;}
}
public virtual int Position {
get {return m_iPosition;}
}
public virtual int Attributes {
get {return (int) m_attributes;}
}
public bool IsIn {
get {return ((m_attributes & ParameterAttributes.In) != 0);}
}
public bool IsOut {
get {return ((m_attributes & ParameterAttributes.Out) != 0);}
}
public bool IsOptional {
get {return ((m_attributes & ParameterAttributes.Optional) != 0);}
}
private String m_strParamName;
private int m_iPosition;
private ParameterAttributes m_attributes;
private MethodBuilder m_methodBuilder;
private ParameterToken m_pdToken;
}
}
|