1

我有几个用 C# 编写的类(准确地说,我的项目中有大约 70-100 个类)。这些类被转换为 Javascript(我已将 V8 Javacript MS ClearScript Engine 添加到我的项目中)并集成到我的应用程序中。我想让我的客户使用 Javascript 而不是 c# 为这些类添加更多功能。

问题是- 我无法理解如何将新函数添加到我的类(最初是用 c# 编写的)中,这些函数将使用 Javascript 和 ClearScript 编写。

我不知道我该怎么做。可能吗?

C#为Javascript编写的搜索类方法:

    [ScriptMember(ScriptMemberFlags.ExposeRuntimeType)]
    public static MdElement GetClass(string mdClass, string mdClassName)
    {
        ...
    }

C#编写的类MdQuery:

    public class QueryCities : MdQuery {
        // C# methods
        public DataTable GetAll() { ... }
    }

Javascript写的扩展方法:

    function filterByCountry(allCities, countryName) {
        ....
    }

Javascript 编写使用 C# 类和 Javasctipt 扩展方法:

    var query = Md.GetClass('MdQuery', 'QueryCities');
    var allCities = query.GetAll();
    var resultList = query.filterByCountry(allCities, 'Angola');
    ...
4

1 回答 1

1

ClearScript 拦截对宿主对象的所有属性访问,但您可以使用代理包装器添加或覆盖您需要的任何内容。

这是一个将主机对象包装在代理中的函数:

function extendHostObject(hostObject) {
    let ext = {};
    Object.defineProperty(ext, 'ext', { value: ext, writable: false });
    return new Proxy(hostObject, {
        get: function (target, prop, rec) {
            let value = Reflect.get(ext, prop, rec);
            return (typeof value !== 'undefined') ? value : Reflect.get(target, prop, rec);
        }
    });
}

你可以像这样使用它:

query = extendHostObject(query);
query.ext.filterByCountry = function (allCities, countryName) {
    // TODO: add code here
};
var resultList = query.filterByCountry(query.GetAll(), 'Angola');

显然,这只是一个示例,您可以通过多种方式对其进行自定义。

于 2019-06-10T16:29:28.223 回答