使用充当 expando 的构造函数创建 C# class
Create C# class with constructor that acts as expando
我想知道是否可以创建一个 class 就像早期 IE 版本中的 ActiveXObject 一样,并将其传递给 MS ClearScript?我找到了一段代码,它使用字符串名称创建了 ActiveXObjects 的实例。
class ActiveXObject
{
public ActiveXObject(string progID)
{
try
{
dynamic wshShell = Activator.CreateInstance(Type.GetTypeFromProgID(progID));
}
catch
{
return null;
}
}
}
这是将 c# 对象附加到 MS ClearScript 对象的代码
using (var engines = new V8ScriptEngine())
{
engines.AddHostObject("ActiveXObject", new ActiveXObject());
}
唯一的问题是如何将 wshshell 分配给 class 的实例?顺便说一下,这是出于教育目的。
如果将 ActiveXObject
实现为 JavaScript 构造函数,它可以 return 任意对象。它不能 return null
以防失败,但你可以解决这个问题:
dynamic setup = engine.Evaluate(@"
(function (factory) {
ActiveXObject = function (progID) {
return factory(progID) ?? { valueOf: () => null };
}
})
");
Func<string, object> factory = progID => {
try {
return Activator.CreateInstance(Type.GetTypeFromProgID(progID));
}
catch {
return null;
}
};
setup(factory);
现在您可以这样做:
engine.AddHostType(typeof(Console));
engine.Execute(@"
let fso = new ActiveXObject('Scripting.FileSystemObject');
if (fso.valueOf()) {
for (let drive of fso.Drives) {
Console.WriteLine(drive.Path);
}
}
");
请注意,原始 ActiveXObject
在失败情况下也不会 return null
;它抛出异常。
我想知道是否可以创建一个 class 就像早期 IE 版本中的 ActiveXObject 一样,并将其传递给 MS ClearScript?我找到了一段代码,它使用字符串名称创建了 ActiveXObjects 的实例。
class ActiveXObject
{
public ActiveXObject(string progID)
{
try
{
dynamic wshShell = Activator.CreateInstance(Type.GetTypeFromProgID(progID));
}
catch
{
return null;
}
}
}
这是将 c# 对象附加到 MS ClearScript 对象的代码
using (var engines = new V8ScriptEngine())
{
engines.AddHostObject("ActiveXObject", new ActiveXObject());
}
唯一的问题是如何将 wshshell 分配给 class 的实例?顺便说一下,这是出于教育目的。
如果将 ActiveXObject
实现为 JavaScript 构造函数,它可以 return 任意对象。它不能 return null
以防失败,但你可以解决这个问题:
dynamic setup = engine.Evaluate(@"
(function (factory) {
ActiveXObject = function (progID) {
return factory(progID) ?? { valueOf: () => null };
}
})
");
Func<string, object> factory = progID => {
try {
return Activator.CreateInstance(Type.GetTypeFromProgID(progID));
}
catch {
return null;
}
};
setup(factory);
现在您可以这样做:
engine.AddHostType(typeof(Console));
engine.Execute(@"
let fso = new ActiveXObject('Scripting.FileSystemObject');
if (fso.valueOf()) {
for (let drive of fso.Drives) {
Console.WriteLine(drive.Path);
}
}
");
请注意,原始 ActiveXObject
在失败情况下也不会 return null
;它抛出异常。