c# - DLR 返回类型

标签 c# dynamic-language-runtime dynamic-binding

我需要 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/

相关文章:

compiler-construction - 使 CLR/.NET 语言可调试

C++克隆并创建以充当虚拟构造函数?

java - 关于Java重载和动态绑定(bind)的问题

c# - 从 sql ExecuteScalar() 中检索值

c# - 单元测试 c# Windows 10 IoT 核心应用程序(错误 : DEP0700)

dynamic - 你如何实现 C#4 的 IDynamicObject 接口(interface)?

java - 我试图通过基类引用提供派生类方法

c# - 使用 Azure Active Directory 进行身份验证时进行 Azure 管理库 API 调用时出错

c# - 尝试在 visual studio 2008 中调试 winforms 应用程序时出错

c# - F# 动态对象访问