如何使用 MS ClearScript 扩展 C# 类型?
How to extend C# types with MS ClearScript?
我有几个classes(准确地说,我的项目中大约有70-100 classes)是用C#写的。那些 classes 被转换为 Javascript(我已将 V8 Javacript MS ClearScript 引擎添加到我的项目中)并集成到我的应用程序中。我想让我的客户使用 Javascript 而不是 c# 向那些 classes 添加更多功能。
问题是 - 我无法理解如何向我的 classes 添加新函数,这些函数将使用 ClearScript 在 Javascript 中编写(最初是用 c# 编写的)。
我不知道我该怎么做。可能吗?
C#写搜索classes方法Javascript:
[ScriptMember(ScriptMemberFlags.ExposeRuntimeType)]
public static MdElement GetClass(string mdClass, string mdClassName)
{
...
}
C# 编写class MdQuery:
public class QueryCities : MdQuery {
// C# methods
public DataTable GetAll() { ... }
}
Javascript写扩展方法:
function filterByCountry(allCities, countryName) {
....
}
Javascript写C#的使用class和Javasctipt的扩展方法:
var query = Md.GetClass('MdQuery', 'QueryCities');
var allCities = query.GetAll();
var resultList = query.filterByCountry(allCities, 'Angola');
...
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');
显然这只是一个示例,您可以通过多种方式对其进行自定义。
我有几个classes(准确地说,我的项目中大约有70-100 classes)是用C#写的。那些 classes 被转换为 Javascript(我已将 V8 Javacript MS ClearScript 引擎添加到我的项目中)并集成到我的应用程序中。我想让我的客户使用 Javascript 而不是 c# 向那些 classes 添加更多功能。
问题是 - 我无法理解如何向我的 classes 添加新函数,这些函数将使用 ClearScript 在 Javascript 中编写(最初是用 c# 编写的)。
我不知道我该怎么做。可能吗?
C#写搜索classes方法Javascript:
[ScriptMember(ScriptMemberFlags.ExposeRuntimeType)]
public static MdElement GetClass(string mdClass, string mdClassName)
{
...
}
C# 编写class MdQuery:
public class QueryCities : MdQuery {
// C# methods
public DataTable GetAll() { ... }
}
Javascript写扩展方法:
function filterByCountry(allCities, countryName) {
....
}
Javascript写C#的使用class和Javasctipt的扩展方法:
var query = Md.GetClass('MdQuery', 'QueryCities');
var allCities = query.GetAll();
var resultList = query.filterByCountry(allCities, 'Angola');
...
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');
显然这只是一个示例,您可以通过多种方式对其进行自定义。