【问题标题】:How to extend C# types with MS ClearScript?如何使用 MS ClearScript 扩展 C# 类型?
【发布时间】:2019-06-10 11:57:06
【问题描述】:

我有几个用 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');
    ...

【问题讨论】:

    标签: c# clearscript


    【解决方案1】:

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

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

    【讨论】:

    • 当用户调用 Md.GetClass 方法时,我可以用 JavaScript 方法扩展 C# 类,文件中定义的 JS 方法,可以在 C# 中返回主机对象之前调用 extendHostObject 吗?
    • 当然,您可以加载并执行 JS 文件,以便 extendHostObject(以及您需要的任何其他功能)到位。然后从Md.GetClass 调用ScriptEngine.Current.Script.extendHostObject。您需要将返回值类型更改为object,并且不再需要ScriptMember 属性。
    猜你喜欢
    • 1970-01-01
    • 2010-11-14
    • 2011-06-22
    • 2011-02-19
    • 2021-07-07
    • 1970-01-01
    • 2020-04-15
    • 2012-09-06
    相关资源
    最近更新 更多