Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
ComEventsMethod.cs
Go to the documentation of this file.
3
5
6internal sealed class ComEventsMethod
7{
8 public class DelegateWrapper
9 {
10 private bool _once;
11
13
15
16 public Delegate Delegate { get; set; }
17
18 public bool WrapArgs { get; }
19
21 {
22 Delegate = d;
24 }
25
26 public object Invoke(object[] args)
27 {
28 if ((object)Delegate == null)
29 {
30 return null;
31 }
32 if (!_once)
33 {
35 _once = true;
36 }
37 if (_cachedTargetTypes != null && _expectedParamsCount == args.Length)
38 {
39 for (int i = 0; i < _expectedParamsCount; i++)
40 {
42 if ((object)type != null)
43 {
44 args[i] = Enum.ToObject(type, args[i]);
45 }
46 }
47 }
48 return Delegate.DynamicInvoke((!WrapArgs) ? args : new object[1] { args });
49 }
50
51 private void PreProcessSignature()
52 {
54 _expectedParamsCount = parameters.Length;
55 Type[] array = null;
56 for (int i = 0; i < _expectedParamsCount; i++)
57 {
58 ParameterInfo parameterInfo = parameters[i];
59 if (parameterInfo.ParameterType.IsByRef && parameterInfo.ParameterType.HasElementType && parameterInfo.ParameterType.GetElementType().IsEnum)
60 {
61 if (array == null)
62 {
64 }
65 array[i] = parameterInfo.ParameterType.GetElementType();
66 }
67 }
68 if (array != null)
69 {
71 }
72 }
73 }
74
76
77 private readonly int _dispid;
78
80
81 public bool Empty
82 {
83 get
84 {
86 {
87 return _delegateWrappers.Count == 0;
88 }
89 }
90 }
91
93 {
95 }
96
98 {
99 while (methods != null && methods._dispid != dispid)
100 {
101 methods = methods._next;
102 }
103 return methods;
104 }
105
107 {
108 method._next = methods;
109 return method;
110 }
111
113 {
114 if (methods == method)
115 {
116 return methods._next;
117 }
119 while (comEventsMethod != null && comEventsMethod._next != method)
120 {
122 }
123 if (comEventsMethod != null)
124 {
125 comEventsMethod._next = method._next;
126 }
127 return methods;
128 }
129
130 public void AddDelegate(Delegate d, bool wrapArgs = false)
131 {
133 {
135 {
136 if (delegateWrapper.Delegate.GetType() == d.GetType() && delegateWrapper.WrapArgs == wrapArgs)
137 {
138 delegateWrapper.Delegate = Delegate.Combine(delegateWrapper.Delegate, d);
139 return;
140 }
141 }
144 }
145 }
146
147 public void RemoveDelegate(Delegate d, bool wrapArgs = false)
148 {
150 {
151 int num = -1;
153 for (int i = 0; i < _delegateWrappers.Count; i++)
154 {
156 if (delegateWrapper2.Delegate.GetType() == d.GetType() && delegateWrapper2.WrapArgs == wrapArgs)
157 {
158 num = i;
160 break;
161 }
162 }
163 if (num >= 0)
164 {
166 if ((object)@delegate != null)
167 {
168 delegateWrapper.Delegate = @delegate;
169 }
170 else
171 {
172 _delegateWrappers.RemoveAt(num);
173 }
174 }
175 }
176 }
177
178 public object Invoke(object[] args)
179 {
180 object result = null;
182 {
184 {
185 result = delegateWrapper.Invoke(args);
186 }
187 return result;
188 }
189 }
190}
void Add(TKey key, TValue value)
object? DynamicInvoke(params object?[]? args)
Definition Delegate.cs:453
MethodInfo Method
Definition Delegate.cs:23
static ? Delegate Remove(Delegate? source, Delegate? value)
Definition Delegate.cs:463
static ? Delegate Combine(Delegate? a, Delegate? b)
Definition Delegate.cs:379
static object ToObject(Type enumType, object value)
Definition Enum.cs:874
ParameterInfo[] GetParameters()
void AddDelegate(Delegate d, bool wrapArgs=false)
static ComEventsMethod Add(ComEventsMethod methods, ComEventsMethod method)
static ComEventsMethod Remove(ComEventsMethod methods, ComEventsMethod method)
readonly List< DelegateWrapper > _delegateWrappers
void RemoveDelegate(Delegate d, bool wrapArgs=false)
static ComEventsMethod Find(ComEventsMethod methods, int dispid)