7

我需要一些 DLR 帮助。我正在实现 IDynamicMetaObjectProvider 和 DynamicMetaObject 但在获取预期的返回类型时遇到了一些问题。我在元对象中覆盖了 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();
}
4

2 回答 2

5

对于返回某些内容的标准二进制文件,返回类型几乎总是对象(get、set、操作等)。否则,标准绑定(例如 DeleteMember)无效。

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

于 2009-09-01T01:54:58.137 回答
0

看来返回类型至少是我使用的 beta 不知道......

我试图使用 DLR 制作 ap/invoke 示例,但似乎这是不可能的,除非您将预期的返回类型作为我最终做的参数传递:\ 在我看来,这似乎是一个限制......希望它将来会解决。

于 2009-12-11T09:27:38.093 回答