Skip to content

Commit 426173b

Browse files
scorteanucosminMrBlue
authored andcommitted
Update HookMethod in order to improve HasMatchingSignature method
1 parent a35ec40 commit 426173b

1 file changed

Lines changed: 22 additions & 13 deletions

File tree

src/Plugins/HookMethod.cs

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -57,23 +57,26 @@ public bool HasMatchingSignature(object[] args, out bool exact)
5757
return true;
5858
}
5959

60-
for (int i = 0; i < args.Length; i++)
60+
int argCount = args.Length;
61+
for (int i = 0; i < argCount; i++)
6162
{
63+
Type parameterType = Parameters[i].ParameterType;
64+
6265
if (args[i] == null)
6366
{
64-
if (CanAssignNull(Parameters[i].ParameterType))
67+
if (CanAssignNull(parameterType))
6568
{
6669
continue;
6770
}
6871

6972
return false;
7073
}
7174

75+
Type argType = args[i].GetType();
7276
if (exact)
7377
{
74-
if (args[i].GetType() != Parameters[i].ParameterType &&
75-
args[i].GetType().MakeByRefType() != Parameters[i].ParameterType &&
76-
!CanConvertNumber(args[i], Parameters[i].ParameterType))
78+
if (argType != parameterType && argType.MakeByRefType() != parameterType &&
79+
!CanConvertNumber(args[i], parameterType))
7780
{
7881
exact = false;
7982
}
@@ -84,23 +87,23 @@ public bool HasMatchingSignature(object[] args, out bool exact)
8487
continue;
8588
}
8689

87-
if (args[i].GetType() == Parameters[i].ParameterType ||
88-
args[i].GetType().MakeByRefType() == Parameters[i].ParameterType ||
89-
Parameters[i].ParameterType.FullName == "System.Object")
90+
if (argType == parameterType || argType.MakeByRefType() == parameterType ||
91+
parameterType.FullName == "System.Object")
9092
{
9193
continue;
9294
}
9395

94-
if (args[i].GetType().IsValueType)
96+
if (argType.IsValueType)
9597
{
96-
if (!TypeDescriptor.GetConverter(Parameters[i].ParameterType).CanConvertFrom(args[i].GetType()) && !CanConvertNumber(args[i], Parameters[i].ParameterType))
98+
if (!TypeDescriptor.GetConverter(parameterType).CanConvertFrom(argType) &&
99+
!CanConvertNumber(args[i], parameterType))
97100
{
98101
return false;
99102
}
100103
}
101104
else
102105
{
103-
if (!Parameters[i].ParameterType.IsInstanceOfType(args[i]))
106+
if (!parameterType.IsInstanceOfType(args[i]))
104107
{
105108
return false;
106109
}
@@ -120,9 +123,15 @@ private bool CanAssignNull(Type type)
120123
return Nullable.GetUnderlyingType(type) != null;
121124
}
122125

123-
private bool IsNumber(object obj)
126+
private bool IsNumber(object? obj)
124127
{
125-
return obj != null && IsNumber(Nullable.GetUnderlyingType(obj.GetType()) ?? obj.GetType());
128+
if (obj == null)
129+
{
130+
return false;
131+
}
132+
133+
Type objectType = obj.GetType();
134+
return IsNumber(Nullable.GetUnderlyingType(objectType) ?? objectType);
126135
}
127136

128137
private bool IsNumber(Type type)

0 commit comments

Comments
 (0)