0

我一直在测试 jint 库并遇到了障碍。给定 C# 中的这个类:

public class Foo
{
    public string Name { get; } = "Bar";
}

而这段代码:

Engine engine = new Engine(x => x.AllowClr());

object rc = _engine
    .SetValue("foo", new Foo())
    .Execute("foo.Name.startsWith('B')")
    .GetCompletionValue()
    .ToObject();

我收到错误:'Jint.Runtime.JavaScriptException:'对象没有方法'startsWith'''

但是,这有效:

"foo.Name == 'Bar'"

那么我可以让前者工作吗?

4

1 回答 1

0

此处添加了对扩展方法的支持。但不能让它直接与 .NET 字符串扩展方法一起使用,它确实与中间扩展类一起使用。

更新:像这样的字符串StartsWith方法确实不是真正的扩展方法。

看起来现在已经原生支持startsWith。替换GetCompletionValue为建议的Evaluate

// Works natively with Jint 3.0.0-beta-2032
Engine engine = new Engine();

bool result = engine
    .SetValue("foo", new Foo())
    .Evaluate("foo.Name.startsWith('B')")
    .AsBoolean();

我尝试添加string扩展方法,但这似乎不起作用。但是将您自己的类用于扩展方法并以这种方式使用它确实有效。

public static class CustomStringExtensions
{
    public static bool StartsWith(this string value, string value2) =>
      value.StartsWith(value2);
}

Engine engine = new Engine(options =>
{
    options.AddExtensionMethods(typeof(CustomStringExtensions));
});

bool result = engine
    .SetValue("foo", new Foo())
    .Evaluate("foo.Name.StartsWith('B')")
    .AsBoolean();

我在这里询问了本地扩展方法支持,因为我很好奇它是否以及应该如何工作。

于 2022-01-27T09:10:00.240 回答