Using Aspect-Oriented Programming to Initialize and Connect WPF Commands: Listing 1.

Creating the DelegateCommand.

var mi = invocation.TargetType.GetMethod(ExecutePrefix + methodName,
          BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
var parameters = mi.GetParameters();

Type commandType;
Type canExecuteType;
Type delegateCommandType;
if (parameters.Length != 1)
{
  commandType = typeof(Action);
  canExecuteType = typeof(Func<bool>);
  delegateCommandType = typeof(DelegateCommand);
}
else
{
  var parameterType = parameters[0].ParameterType;
  commandType = typeof(Action<>).MakeGenericType(parameterType);
  canExecuteType = typeof(Predicate<>).MakeGenericType(parameterType);
  delegateCommandType = typeof(DelegateCommand<>).MakeGenericType(parameterType);
}

var commandDelegate = Delegate.CreateDelegate(commandType, 
                         invocation.InvocationTarget,
                         ExecutePrefix + methodName);
var canExecuteDelegate = Delegate.CreateDelegate(canExecuteType, 
                             invocation.InvocationTarget,
                             CanExecutePrefix + methodName, false, false);
var delegateCommand = Activator.CreateInstance(delegateCommandType,
                         canExecuteDelegate == null
                         ? new object[] { commandDelegate }
                         : new object[] { commandDelegate, canExecuteDelegate });
commands.Add(key, delegateCommand);
invocation.ReturnValue = delegateCommand;
return;
WPF Commands

About the Author

Patrick Steele is a senior .NET developer with Billhighway in Troy, Mich. A recognized expert on the Microsoft .NET Framework, he’s a former Microsoft MVP award winner and a presenter at conferences and user group meetings.

comments powered by Disqus

Featured

  • Copilot AI Billing Shock Met with Meters, Caps and Token-Saving Tools

    GitHub is layering spending limits, expanded credit allowances and increasingly granular usage reporting onto Copilot, while Microsoft is reworking Visual Studio and VS Code to expose -- and reduce -- the cost of agentic development.

  • The AI-Powered Software Development Lifecycle

    René van Osnabrugge makes the case that AI's biggest opportunity in software development is not faster coding -- it's reducing the friction everywhere else in the SDLC.

  • Copilot Usage-Based Billing Gets a Token Dashboard

    Microsoft is keeping Visual Studio's new built-in Agent Skills switched off by default while a public dashboard measures whether their performance gains justify the additional tokens they may consume.

  • VS Code 1.129 Introduces Agent Host and Experimental Agents Window Editor

    Visual Studio Code 1.129 adds a dedicated process for running AI agent sessions and an experimental docked editor for reviewing agent-generated changes.

Subscribe on YouTube