public static void CreateCommandWithGesture(this ICommandManager commandManager, Type containerType, string commandNameFieldName)
{
Argument.IsNotNull("commandManager", commandManager);
Argument.IsNotNull("containerType", containerType);
Argument.IsNotNullOrWhitespace("commandNameFieldName", commandNameFieldName);
Log.Debug("Creating command '{0}'", commandNameFieldName);
// Note: we must store bindingflags inside variable otherwise invalid IL will be generated
var bindingFlags = BindingFlags.Public | BindingFlags.Static;
var commandNameField = containerType.GetFieldEx(commandNameFieldName, bindingFlags);
if (commandNameField == null)
{
throw Log.ErrorAndCreateException<InvalidOperationException>("Command '{0}' is not available on container type '{1}'",
commandNameFieldName, containerType.GetSafeFullName(false));
}
var commandName = (string)commandNameField.GetValue(null);
if (commandManager.IsCommandCreated(commandName))
{
Log.Debug("Command '{0}' is already created, skipping...", commandName);
return;
}
InputGesture commandInputGesture = null;
var inputGestureField = containerType.GetFieldEx(string.Format("{0}InputGesture", commandNameFieldName), bindingFlags);
if (inputGestureField != null)
{
commandInputGesture = inputGestureField.GetValue(null) as InputGesture;
}
commandManager.CreateCommand(commandName, commandInputGesture);
var commandContainerName = string.Format("{0}CommandContainer", commandName.Replace(".", string.Empty));
var commandContainerType = (from type in TypeCache.GetTypes()
where string.Equals(type.Name, commandContainerName, StringComparison.OrdinalIgnoreCase)
select type).FirstOrDefault();
if (commandContainerType == null)
{
Log.Debug("Couldn't find command container '{0}', you will need to add a custom action or command manually in order to make the CompositeCommand useful", commandContainerName);
return;
}
Log.Debug("Found command container '{0}', registering it in the ServiceLocator now", commandContainerType.GetSafeFullName(false));
var serviceLocator = commandManager.GetServiceLocator();
if (!serviceLocator.IsTypeRegistered(commandContainerType))
{
var typeFactory = serviceLocator.ResolveType<ITypeFactory>();
var commandContainer = typeFactory.CreateInstance(commandContainerType);
if (commandContainer != null)
{
serviceLocator.RegisterInstance(commandContainer);
}
else
{
Log.Warning("Cannot create command container '{0}', skipping registration", commandContainerType.GetSafeFullName(false));
}
}
}
}