Как расширить типы C # с MS ClearScript? - PullRequest
0 голосов
/ 10 июня 2019

У меня есть несколько классов (если быть точным, в моем проекте около 70-100 классов), написанных на C #.Эти классы преобразуются в Javascript (я добавил V8 Javacript MS ClearScript Engine в мой проект) и интегрированы в мое приложение.Я хочу разрешить своим клиентам добавлять больше функциональности в эти классы с помощью Javascript, а не c #.

Проблема в - я не могу понять, как я могу добавить новые функции, которые будут написаны наJavascript с ClearScript, для моих классов (которые были изначально написаны на C #).

Я понятия не имею, как я могу это сделать.Возможно ли это?

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');
    ...

1 Ответ

0 голосов
/ 10 июня 2019

ClearScript перехватывает все свойства доступа к хост-объектам, но вы можете использовать оболочку Proxy , чтобы добавить или переопределить все, что вам нужно.

Вот функция, которая оборачивает хост-объект в прокси:

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');

Очевидно, что это всего лишь пример, и вы можете настроить его любым количеством способов.

...