DLR返回类型(DLR return type)

2019-08-03 07:06发布

我需要一些帮助DLR。 我采取的IDynamicMetaObjectProvider和DynamicMetaObject,但我有一些问题得到预期的返回类型。 我在元对象overiding BindInvokeMember,我可以看到所有的ARGS类型,但没有返回类型。 任何人都知道,如果可能的话我怎么得到它? 我知道返回类型是动态的,但如果你调用的是依赖于返回类型是什么。 我不知道在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();
}

Answer 1:

对于返回的东西返回类型几乎都是反对的标准二进制(获取,设置,操作等)。 否则,它是无效的标准绑定(如DeleteMember)。

您也可以从传入的粘结剂的返回类型物业在运行时获取预期收益类型。



Answer 2:

它出现在返回类型至少是我用不知道公测...

我试图让使用DLR AP /援引的例子,但它似乎是,除非你的预期收益型作为我最后做一个参数传递,这是不可能的:\这似乎对我来说,限制...希望它将在今后得到解决。



文章来源: DLR return type