我有一些用C#编写的类(准确地说,我的项目中大约有70-100个类)。这些类将转换为Javascript(我在项目中添加了 V8 Javacript MS ClearScript 引擎),并集成到了我的应用程序中。我想允许我的客户使用Javascript而非c#向这些类添加更多功能。
问题是-我无法理解如何向我的类(最初使用c#编写)中添加使用ClearScript用Javascript编写的新函数。
我不知道该怎么做。有可能吗?
针对Javascript的C#书面搜索类方法:
[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) {
....
}
使用C#类和Javasctipt扩展方法编写的Javascript:
var query = Md.GetClass('MdQuery', 'QueryCities');
var allCities = query.GetAll();
var resultList = query.filterByCountry(allCities, 'Angola');
...
答案 0 :(得分:0)
ClearScript会拦截对主机对象的所有属性访问,但是您可以使用https://codesandbox.io/s/cancellable-counter-example-qomw6包装器来添加或覆盖所需的内容。
这是一个将主机对象包装在代理中的函数:
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');
显然,这只是一个示例,您可以通过多种方式对其进行自定义。