我正在编写一个 Javascript <-> C# 桥并遇到以下问题:
有一个类 JSObject:
public class JSObject : DynamicObject
{
public JSEngineAPI wrappedObject { get; set; }
public JSObject(JSEngineAPI WrappedObject);
public override bool TryConvert(ConvertBinder binder, out object result);
public override bool TryGetMember(GetMemberBinder binder, out object result);
...
}
让我们假设有一个简单的测试用例,比如
public class TestClass
{
public string message = "This is a C# string";
}
public class TestApp
{
public string testComplexObject(TestClass obj)
{
return obj.message;
}
}
现在我想能够做到
JSObject jsObj = ...;
string message = testComplexObject(jsObj);
做obj.message
应该执行一个TryGetMember()
调用。实际上,jsObj 应该伪装成一个 TestClass 实例。请注意,对 testComplexObject 的调用只是一个示例,稍后我需要能够支持使用任意参数调用任意函数。
我尝试了各种方法来完成这项工作,但都没有奏效。所以我想知道实现这一目标的好方法。
我考虑过在运行时创建一个继承自TestClass 的类。这个动态类将包含生成的成员,这些成员重载了它们的基类挂件。这些方法中的每一个都将转发到 JSObject/JSEngineAPI 以执行实际工作。然后我可以将这个动态类的一个实例传递给 testComplexObject 方法。
然而,这听起来相当复杂,我很想知道是否有更简单/其他的方法来解决这个问题。
编辑#1:我想如果你去掉“DynamicObject”部分,这个问题有点像我如何在运行时为类型 T 创建代理?
编辑#2:我现在也研究了 RealProxy 和 IDynamicMetaObjectProvider,想知道这些是否有帮助。
谢谢你的时间,-马蒂亚斯