使用充当 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;它抛出异常。