@@ -37,11 +37,7 @@ public class AddinData
3737 foreach ( var ctx in constructors )
3838 {
3939 var ctxParams = ctx . GetParameters ( ) ;
40- bool useCtx = true ;
41- for ( int i = 0 ; i < ctxParams . Length && useCtx ; i ++ )
42- {
43- useCtx = ctxParams [ i ] . ParameterType == parameters [ i ] . GetType ( ) ;
44- }
40+ bool useCtx = ParametersMatch ( ctxParams , parameters ) ;
4541
4642 if ( useCtx )
4743 {
@@ -60,76 +56,104 @@ public class AddinData
6056
6157 public object CallStaticMethod ( string methodName , params object [ ] parameters )
6258 {
63- parameters = parameters ?? new object [ 0 ] ;
59+ parameters = TransformParameters ( parameters ) ;
6460
65- for ( int i = 0 ; i < parameters . Length ; i ++ )
61+ var methods = this . _definedMethods . Where ( m => m . IsPublic && m . IsStatic && string . Compare ( m . Name , methodName , StringComparison . OrdinalIgnoreCase ) == 0 ) ;
62+ MethodInfo method = null ;
63+
64+ foreach ( var m in methods . Where ( m => m . GetParameters ( ) . Length == parameters . Length ) )
6665 {
67- var parameterType = parameters [ i ] . GetType ( ) ;
68- int index = parameterType == typeof ( string ) ? parameters [ i ] . ToString ( ) . IndexOf ( '.' ) : - 1 ;
69- if ( index >= 0 )
66+ var methodParams = m . GetParameters ( ) ;
67+ bool useMethod = ParametersMatch ( methodParams , parameters ) ;
68+
69+ if ( useMethod )
7070 {
71- var enumOrClass = parameters [ i ] . ToString ( ) . Substring ( 0 , index ) ;
72- var enumType = _declaredEnums . FirstOrDefault ( e => string . Compare ( e . Name , enumOrClass , StringComparison . OrdinalIgnoreCase ) == 0 ) ;
73- if ( enumType is object )
74- {
75- var value = parameters [ i ] . ToString ( ) . Substring ( index + 1 ) ;
76- parameters [ i ] = Enum . Parse ( enumType , value ) ;
77- }
71+ method = m ;
72+ break ;
7873 }
7974 }
8075
81- var methods = this . _definedMethods . Where ( m => m . IsPublic && m . IsStatic && string . Compare ( m . Name , methodName , StringComparison . OrdinalIgnoreCase ) == 0 ) ;
82- MethodInfo method = null ;
76+ if ( method is null )
77+ {
78+ throw new NullReferenceException ( $ "No method with the name '{ methodName } ' was found!") ;
79+ }
8380
84- foreach ( var m in methods . Where ( m => m . GetParameters ( ) . Length == parameters . Length ) )
81+ return method . Invoke ( null , parameters ) ;
82+ }
83+
84+ public object [ ] TransformParameters ( params object [ ] parameters )
85+ {
86+ var newParameters = new List < object > ( ) ;
87+ if ( parameters is null )
8588 {
86- var methodParams = m . GetParameters ( ) ;
87- bool useMethod = true ;
89+ return newParameters . ToArray ( ) ;
90+ }
8891
89- for ( int i = 0 ; i < methodParams . Length && useMethod ; i ++ )
92+ foreach ( var parameter in parameters )
93+ {
94+ object value = parameter ;
95+ if ( parameter is string sParam )
9096 {
91- var methodParamType = methodParams [ i ] . ParameterType ;
92- var optionParamType = parameters [ i ] . GetType ( ) ;
93- if ( methodParamType . IsEnum && optionParamType == typeof ( string ) )
97+ int index = sParam . IndexOf ( '.' ) ;
98+ if ( index >= 0 )
9499 {
95- try
100+ var enumOrClass = sParam . Substring ( 0 , index ) ;
101+ var subValue = sParam . Substring ( index + 1 ) ;
102+ var enumType = _declaredEnums . FirstOrDefault ( e => string . Compare ( e . Name , enumOrClass , StringComparison . OrdinalIgnoreCase ) == 0 ) ;
103+ var classType = _definedClasses . FirstOrDefault ( c => string . Compare ( c . Name , enumOrClass , StringComparison . OrdinalIgnoreCase ) == 0 ) ;
104+ if ( enumType is object )
96105 {
97- var parsedValue = Enum . Parse ( methodParamType , parameters [ i ] . ToString ( ) ) ;
98- if ( parsedValue is object )
99- {
100- parameters [ i ] = parsedValue ;
101- }
102- else
103- useMethod = false ;
106+ value = Enum . Parse ( enumType , subValue ) ;
104107 }
105- catch
108+ else if ( classType is object )
106109 {
107- useMethod = false ;
110+ var property = classType . GetProperty ( subValue , BindingFlags . GetProperty | BindingFlags . Public | BindingFlags . Static ) ;
111+ value = property . GetValue ( null ) ;
108112 }
109113 }
110- else if ( methodParamType == typeof ( Enum ) && optionParamType . IsEnum )
114+ }
115+
116+ newParameters . Add ( value ) ;
117+ }
118+
119+ return newParameters . ToArray ( ) ;
120+ }
121+
122+ public static bool ParametersMatch ( ParameterInfo [ ] methodParameters , object [ ] parameters )
123+ {
124+ bool useMethod = true ;
125+ for ( int i = 0 ; i < methodParameters . Length && useMethod ; i ++ )
126+ {
127+ var methodParamType = methodParameters [ i ] . ParameterType ;
128+ var optionParamType = parameters [ i ] . GetType ( ) ;
129+ if ( methodParamType . IsEnum && optionParamType == typeof ( string ) )
130+ {
131+ try
111132 {
112- useMethod = true ;
113- }
114- else
133+ var parsedValue = Enum . Parse ( methodParamType , parameters [ i ] . ToString ( ) ) ;
134+ if ( parsedValue is object )
135+ {
136+ parameters [ i ] = parsedValue ;
137+ }
138+ else
139+ useMethod = false ;
140+ }
141+ catch
115142 {
116- useMethod = methodParamType == optionParamType || methodParamType . IsAssignableFrom ( optionParamType ) ;
143+ useMethod = false ;
117144 }
118145 }
119-
120- if ( useMethod )
146+ else if ( methodParamType == typeof ( Enum ) && optionParamType . IsEnum )
121147 {
122- method = m ;
123- break ;
148+ useMethod = true ;
149+ }
150+ else
151+ {
152+ useMethod = methodParamType == optionParamType || methodParamType . IsAssignableFrom ( optionParamType ) ;
124153 }
125154 }
126155
127- if ( method is null )
128- {
129- throw new NullReferenceException ( "No method with the specified name was found!" ) ;
130- }
131-
132- return method . Invoke ( null , parameters ) ;
156+ return useMethod ;
133157 }
134158
135159 protected void Initialize ( ICakeContext context , string packageName , string packageVersion , string assemblyName = null )
0 commit comments