Тип возврата DLR

Мне нужна помощь 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();
}

2 ответа

Для стандартных двоичных файлов, которые возвращают что-то, тип возвращаемого значения почти всегда является объектом (get, set, операции и т. Д.). В противном случае это недействительно для стандартных привязок (например, DeleteMember).

Вы также можете получить ожидаемый тип возвращаемого значения во время выполнения из свойства ReturnType входящего связывателя.

Похоже, что возвращаемый тип - это бета, которую я использовал, не знаю...

Я пытался создать пример a p/invoke с использованием DLR, но кажется, что это невозможно, если вы не передадите ожидаемый тип возвращаемого значения в качестве параметра, который я в итоге сделал:\ Это мне кажется ограничением... Надеюсь, это будут рассмотрены в будущем.

Другие вопросы по тегам