How do I express a void method call as the result of DynamicMetaObject.BindInvokeMember?

前端 未结 4 1784
栀梦
栀梦 2021-01-31 01:47

I\'m trying to give a short example of IDynamicMetaObjectProvider for the second edition of C# in Depth, and I\'m running into issues.

I want to be able to express a voi

4条回答
  •  伪装坚强ぢ
    2021-01-31 02:28

    Perhaps the callsite expects null to be returned but discards the result - This enum looks interesting, particularly the "ResultDiscarded" flag...

    [Flags, EditorBrowsable(EditorBrowsableState.Never)]
    public enum CSharpBinderFlags
    {
        BinaryOperationLogical = 8,
        CheckedContext = 1,
        ConvertArrayIndex = 0x20,
        ConvertExplicit = 0x10,
        InvokeSimpleName = 2,
        InvokeSpecialName = 4,
        None = 0,
        ResultDiscarded = 0x100,
        ResultIndexed = 0x40,
        ValueFromCompoundAssignment = 0x80
    }
    

    Food for thought...

    UPDATE:

    More hints can be gleaned from Microsoft / CSharp / RuntimeBinder / DynamicMetaObjectProviderDebugView which is used (I presume) as a visualizer for debuggers. The method TryEvalMethodVarArgs examines the delegate and creates a binder with the result discarded flag (???)

     Type delegateType = Expression.GetDelegateType(list.ToArray());
        if (string.IsNullOrEmpty(name))
        {
            binder = new CSharpInvokeBinder(CSharpCallFlags.ResultDiscarded, AccessibilityContext, list2.ToArray());
        }
        else
        {
            binder = new CSharpInvokeMemberBinder(CSharpCallFlags.ResultDiscarded, name, AccessibilityContext, types, list2.ToArray());
        }
        CallSite site = CallSite.Create(delegateType, binder);
    

    ... I'm at the end of my Reflector-foo here, but the framing of this code seems a bit odd since the TryEvalMethodVarArgs method itself expects an object as a return type, and the final line returns the result of the dynamic invoke. I'm probably barking up the wrong [expression] tree.

    -Oisin

提交回复
热议问题