gpt4 book ai didi

c# - DLR 返回类型

转载 作者:太空狗 更新时间:2023-10-29 20:29:36 25 4
gpt4 key购买 nike

我需要 DLR 的帮助。我正在实现 IDynamicMetaObjectProvider 和 DynamicMetaObject,但我在获取预期的返回类型时遇到了一些问题。我在元对象中覆盖了 BindInvokeMember,我可以看到所有的参数类型,但没有返回类型。如果可能的话,有人知道我是怎么做到的吗?我知道返回类型是动态的,但是如果你调用的东西依赖于返回类型怎么办。我不知道在 DynamicMetaObject 中执行哪个操作,除非我知道消费者期望的返回类型。

更新二

我无法在此处粘贴我的实际代码,因为它会调用各种工作内容。下面是一些示例动态对象代码。

public class TestDynamicMetaObject : DynamicMetaObject
{
public TestDynamicMetaObject(Expression expression, object value)
: base (expression, BindingRestrictions.Empty, value)
{
}

public override DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args)
{
Delegate method = new Func<int>(Test);
return new DynamicMetaObject(
Expression.Call(method.Method),
BindingRestrictions.GetInstanceRestriction(Expression,Value),
Value
);
}

public static int Test()
{
return 10;
}

}
public class TestDynamicObject : IDynamicMetaObjectProvider
{
DynamicMetaObject IDynamicMetaObjectProvider.GetMetaObject(Expression parameter)
{
return new TestDynamicMetaObject(parameter, this);
}
}

这是我正在使用的地方。

static void Main(string[] args)
{
try
{
dynamic x = new TestDynamicObject();
int gg= x.Test();
Console.WriteLine(gg);
}
catch (Exception excep)
{
Console.WriteLine(excep);
}
Console.ReadLine();
}

这是编译器创建的代码。

private static void Main(string[] args)
{
try
{
object x = new TestDynamicObject();
if (<Main>o__SiteContainer0.<>p__Site1 == null)
{
<Main>o__SiteContainer0.<>p__Site1 = CallSite<Func<CallSite, object, int>>.Create(new CSharpConvertBinder(typeof(int), CSharpConversionKind.ImplicitConversion, false));
}
if (<Main>o__SiteContainer0.<>p__Site2 == null)
{
<Main>o__SiteContainer0.<>p__Site2 = CallSite<Func<CallSite, object, object>>.Create(new CSharpInvokeMemberBinder(CSharpCallFlags.None, "Test", typeof(Program), null, new CSharpArgumentInfo[] { new CSharpArgumentInfo(CSharpArgumentInfoFlags.None, null) }));
}
Console.WriteLine(<Main>o__SiteContainer0.<>p__Site1.Target(<Main>o__SiteContainer0.<>p__Site1, <Main>o__SiteContainer0.<>p__Site2.Target(<Main>o__SiteContainer0.<>p__Site2, x)));
}
catch (Exception excep)
{
Console.WriteLine(excep);
}
Console.ReadLine();
}

最佳答案

对于返回某些东西的标准二进制文件,返回类型几乎总是对象(获取、设置、操作等)。否则它对标准绑定(bind)无效(例如 DeleteMember)。

您还可以在运行时从传入 Binder 的 ReturnType 属性中获取预期的返回类型。

关于c# - DLR 返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1360097/

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