@@ -5,7 +5,9 @@ This Source Code Form is subject to the terms of the
55at http://mozilla.org/MPL/2.0/.
66----------------------------------------------------------*/
77using System ;
8+ using System . Diagnostics ;
89using System . Linq ;
10+ using System . Linq . Expressions ;
911using System . Reflection ;
1012using OneScript . Commons ;
1113using OneScript . Contexts ;
@@ -19,37 +21,46 @@ namespace ScriptEngine.Machine.Contexts
1921 public static class ContextValuesMarshaller
2022 {
2123 public static MethodInfo BslParameterConverter { get ; private set ; }
22- public static MethodInfo BslParameterGenericConverter { get ; private set ; }
24+ public static MethodInfo BslGenericParameterConverter { get ; private set ; }
2325 public static MethodInfo BslReturnValueGenericConverter { get ; private set ; }
2426
2527 static ContextValuesMarshaller ( )
2628 {
2729 BslParameterConverter = typeof ( ContextValuesMarshaller ) . GetMethods ( )
28- . First ( x => x . Name == nameof ( ConvertParam ) && x . GetGenericArguments ( ) . Length == 0 && x . GetParameters ( ) . Length == 3 ) ;
30+ . First ( x => x . Name == nameof ( ConvertParam ) && x . GetGenericArguments ( ) . Length == 0 &&
31+ x . GetParameters ( ) . Length == 4 ) ;
2932
30- BslParameterGenericConverter = typeof ( ContextValuesMarshaller ) . GetMethods ( )
31- . First ( x => x . Name == nameof ( ConvertParam ) && x . GetGenericArguments ( ) . Length == 1 && x . GetParameters ( ) . Length == 3 ) ;
33+ BslGenericParameterConverter = typeof ( ContextValuesMarshaller ) . GetMethods ( )
34+ . First ( x => x . Name == nameof ( ConvertParam ) && x . GetGenericArguments ( ) . Length == 1 &&
35+ x . GetParameters ( ) . Length == 3 ) ;
3236
3337 BslReturnValueGenericConverter = typeof ( ContextValuesMarshaller ) . GetMethods ( )
3438 . First ( x => x . Name == nameof ( ConvertReturnValue ) && x . GetGenericArguments ( ) . Length == 1 ) ;
3539 }
3640
37- public static T ConvertParam < T > ( IValue value , T defaultValue = default )
38- {
39- return ConvertParam < T > ( value , ForbiddenBslProcess . Instance , defaultValue ) ;
40- }
41-
42- public static T ConvertParam < T > ( IValue value , IBslProcess process , T defaultValue = default )
41+ /// <summary>
42+ /// Выполняет конвертацию значения из Bsl в значение параметра метода C#
43+ /// </summary>
44+ /// <param name="value">Универсальное значение из Bsl</param>
45+ /// <param name="type">Целевой тип в который надо сконвертировать значение.</param>
46+ /// <param name="defaultValue">Значение по умолчанию, которое будет возвращено, если <paramref name="value"/> не заполнен.</param>
47+ /// <param name="process">Текущий BSL-процесс, в рамках которого вызывается метод</param>
48+ /// <returns>Значение целевого типа</returns>
49+ public static object ConvertParam ( IValue value , Type type , object defaultValue , IBslProcess process )
4350 {
44- object valueObj = ConvertParam ( value , typeof ( T ) , process ) ;
45- return valueObj != null ? ( T ) valueObj : defaultValue ;
51+ Debug . Assert ( defaultValue == null || type . IsInstanceOfType ( defaultValue ) ) ;
52+
53+ var converted = ConvertParam ( value , type , process ) ;
54+ return converted ?? defaultValue ;
4655 }
4756
48- public static object ConvertParam ( IValue value , Type type )
49- {
50- return ConvertParam ( value , type , ForbiddenBslProcess . Instance ) ;
51- }
52-
57+ /// <summary>
58+ /// Выполняет конвертацию значения из Bsl в значение параметра метода C#
59+ /// </summary>
60+ /// <param name="value">Универсальное значение из Bsl</param>
61+ /// <param name="type">Целевой тип в который надо сконвертировать значение.</param>
62+ /// <param name="process">Текущий BSL-процесс, в рамках которого вызывается метод</param>
63+ /// <returns>Значение целевого типа</returns>
5364 public static object ConvertParam ( IValue value , Type type , IBslProcess process )
5465 {
5566 try
@@ -65,12 +76,40 @@ public static object ConvertParam(IValue value, Type type, IBslProcess process)
6576 throw RuntimeException . InvalidArgumentValue ( ) ;
6677 }
6778 }
68-
79+
80+ /// <summary>
81+ /// Выполняет конвертацию значения из Bsl в значение параметра метода C#.
82+ /// В данный метод нельзя передавать значения, конвертация которых в целевой тип (напр. строку)
83+ /// может приводить к вызову другого Bsl-кода. Метод выбросит исключение, если конвертация захочет выполнить bsl-код.
84+ /// </summary>
85+ /// <param name="value">Универсальное значение из Bsl</param>
86+ /// <param name="defaultValue">Значение по умолчанию, которое будет возвращено, если <paramref name="value"/> не заполнен.</param>
87+ /// <typeparam name="T">Целевой тип в который надо сконвертировать значение</typeparam>
88+ /// <returns>Значение целевого типа</returns>
89+ public static T ConvertParam < T > ( IValue value , T defaultValue = default )
90+ {
91+ return ConvertParam < T > ( value , defaultValue , ForbiddenBslProcess . Instance ) ;
92+ }
93+
6994 /// <summary>
70- /// Выполняет строгую конвертацию парамтера в запрошенный тип.
95+ /// Выполняет конвертацию значения из Bsl в значение параметра метода C#
96+ /// </summary>
97+ /// <param name="value">Универсальное значение из Bsl</param>
98+ /// <param name="process">Текущий BSL-процесс, в рамках которого вызывается метод</param>
99+ /// <param name="defaultValue">Значение по умолчанию, которое будет возвращено, если <paramref name="value"/> не заполнен.</param>
100+ /// <typeparam name="T">Целевой тип в который надо сконвертировать значение</typeparam>
101+ /// <returns>Значение целевого типа</returns>
102+ public static T ConvertParam < T > ( IValue value , T defaultValue , IBslProcess process )
103+ {
104+ object valueObj = ConvertParam ( value , typeof ( T ) , process ) ;
105+ return valueObj != null ? ( T ) valueObj : defaultValue ;
106+ }
107+
108+ /// <summary>
109+ /// Выполняет строгую конвертацию параметра в запрошенный тип.
71110 /// Не выполняет приведение объектов к строке, в отличие от ConvertParam.
72111 /// Это значит, что нельзя скормить объект в C# параметр с типом string через конверсию в AsString.
73- /// Выдает исключение о неверном типе парамтера .
112+ /// Выдает исключение о неверном типе параметра .
74113 /// </summary>
75114 public static T ConvertValueStrict < T > ( IValue value )
76115 {
@@ -102,6 +141,21 @@ public static T ConvertValueStrict<T>(IValue value)
102141 }
103142 }
104143
144+ public static Expression GetDefaultBslValueConstant ( Type targetType )
145+ {
146+ if ( targetType == typeof ( string ) )
147+ {
148+ return Expression . Constant ( "" ) ;
149+ }
150+
151+ return Expression . Default ( targetType ) ;
152+ }
153+
154+ public static object ConvertParam ( IValue value , Type type )
155+ {
156+ return ConvertParam ( value , type , ForbiddenBslProcess . Instance ) ;
157+ }
158+
105159 private static object ConvertValueType ( IValue value , Type type , IBslProcess process )
106160 {
107161 object valueObj ;
0 commit comments