コード例 #1
0
        public object InvokeGet(IRibbonControl control, Expression <Action> caller, params object[] parameters)
        {
            if (control.Context == null)
            {
                return(null);
            }

            var            methodName     = caller.GetMethodName();
            CallbackTarget callbackTarget = vstoContribContext.TagToCallbackTargetLookup[control.Tag + methodName];

            var view = (object)control.Context;
            IRibbonViewModel viewModelInstance = ribbonViewModelResolver.ResolveInstanceFor(view);

            VstoContribLog.Debug(l => l("Ribbon callback {0} being invoked on {1} (View: {2}, ViewModel: {3})",
                                        methodName, control.Id, view.ToLogFormat(), viewModelInstance.ToLogFormat()));

            Type         type     = viewModelInstance.GetType();
            PropertyInfo property = type.GetProperty(callbackTarget.Method);

            if (property != null)
            {
                return(type.InvokeMember(callbackTarget.Method,
                                         BindingFlags.GetProperty,
                                         null,
                                         viewModelInstance,
                                         null));
            }

            try
            {
                return(type.InvokeMember(callbackTarget.Method,
                                         BindingFlags.InvokeMethod,
                                         null,
                                         viewModelInstance,
                                         new[]
                {
                    control
                }
                                         .Concat(parameters)
                                         .ToArray()));
            }
            catch (MissingMethodException)
            {
                throw new InvalidOperationException(
                          string.Format("Expecting method with signature: {0}.{1}(IRibbonControl control)",
                                        type.Name,
                                        callbackTarget.Method));
            }
        }
コード例 #2
0
        public object InvokeGet(IRibbonControl control, Expression <Action> caller, params object[] parameters)
        {
            CallbackTarget callbackTarget = vstoContribContext.TagToCallbackTargetLookup[control.Tag + caller.GetMethodName()];

            IRibbonViewModel viewModelInstance = ribbonViewModelResolver.ResolveInstanceFor(control.Context);

            Type         type     = viewModelInstance.GetType();
            PropertyInfo property = type.GetProperty(callbackTarget.Method);

            if (property != null)
            {
                return(type.InvokeMember(callbackTarget.Method,
                                         BindingFlags.GetProperty,
                                         null,
                                         viewModelInstance,
                                         null));
            }

            try
            {
                return(type.InvokeMember(callbackTarget.Method,
                                         BindingFlags.InvokeMethod,
                                         null,
                                         viewModelInstance,
                                         new[]
                {
                    control
                }
                                         .Concat(parameters)
                                         .ToArray()));
            }
            catch (MissingMethodException)
            {
                throw new InvalidOperationException(
                          string.Format("Expecting method with signature: {0}.{1}(IRibbonControl control)",
                                        type.Name,
                                        callbackTarget.Method));
            }
        }