Получить экземпляр System.Type из скрипта (ClearScript) - PullRequest
0 голосов
/ 11 апреля 2020

Я получаю исключение при попытке вызвать Enum.Parse из скрипта, размещенного через ClearScript

Ошибка

Error: The non-generic method 'System.Enum.Parse(System.Type, string)' cannot be used with type arguments
--- Script error details follow ---
   Error: The non-generic method 'System.Enum.Parse(System.Type, string)' cannot be used with type arguments
       at translateParameterValue (Script [temp]:11:27) ->          return clr.System.Enum.Parse(app.MyLibrary.MyEnum, value);

Скрипт

return clr.System.Enum.Parse(app.MyLibrary.MyEnum, value);

Я почти уверен, что правильно зарегистрировал объект clr (он содержит mscorlib, System и System.Core)

Кажется, ClearScript пытается вызвать и запутывается, нужно ли первый параметр app.MyLibrary.MyEnum универсальный c параметр или передать его как System.Type параметр.

Вопрос

Что можно сделать, чтобы правильно вызвать функцию System.Enum.Parse в этом сценарии?

1 Ответ

1 голос
/ 11 апреля 2020

Ответ был проще, чем я думал. Поскольку ClearScript рассматривал первый аргумент как параметр generi c, вам просто нужна функция, которая возвращает экземпляр System.Type из параметра type, который может быть простым:

class Utility
{
    public Type GetType<T>() {
        return typeof(T);
    }
}

Затем зарегистрируйте его на ваш ScriptEngine:

_engine.AddHostObject("Utility", new Utility());

Затем используйте его в своем скрипте как:

return clr.System.Enum.Parse(Utility.GetType(nepes.DecaTech.CoreData.ProcessStates), value);

ClearScript также поставляется с утилитным классом ExtendedHostFunctions, который предоставляет несколько полезных служебных функций, включая один похож на выше typeOf(T).

...