gpt4 book ai didi

C# 将 DynamicObject 转换为任意类型

转载 作者:行者123 更新时间:2023-11-30 16:30:43 27 4
gpt4 key购买 nike

我正在编写一个 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,想知道它们是否有任何帮助。

谢谢你的时间,-马蒂亚斯

最佳答案

由于无法更改方法的签名,您可以创建一个代理来代表您的动态对象。仅当对象是 POD 或您坚持使用可以覆盖的虚拟方法时,这才会有效。否则你的方法可能最终不会被使用。它将实现所需的类型,但会将所有访问传递给您的实际对象。如果您向动态对象添加一些转换方法,使用它会很容易。像这样:

public class JSObject : DynamicObject
{
class TestClassProxy : TestClass
{
private dynamic wrapper;
public TestClassProxy(dynamic obj)
{
wrapper = obj;
// assign copies of the fields
message = obj.message;
}
// override all required methods and properties
public override void SampleMethod()
{
wrapper.SampleMethod();
}
public override int SomeValue
{
get { return wrapper.SomeValue; }
set { wrapper.SomeValue = value; }
}
// etc...
}

public override bool TryConvert(ConvertBinder binder, out object result)
{
if (binder.Type == typeof(TestClass))
{
result = new TestClassProxy(this);
return true;
}
// your other conversions
return base.TryConvert(binder, out result);
}
// etc...
}

如果您需要对您的对象做更多的事情,除了更改方法的签名之外,我不知道您还能如何解决这个问题。

关于C# 将 DynamicObject 转换为任意类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5465658/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com