0

I am trying to implement a solution from another SO post here in order to be able to code commands directly rather then use SRGMS XML file as a command input. I believe that is what the post is trying to do, but I am having trouble implementing it.

My code is below, but it is not working (Error line has comment next to it). If someone could provide a simple explanation of how to get this code working in a WindowsForm Application I would deeply appreciate it.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Speech.Recognition;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Commands
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        LoadStart();
    }

    private void LoadStart()
    {
        MethodInfo myMethod;

        var methods = new Commands();

        myMethod = CommandFactory.GetCommandMethods("Time Please");
        myMethod.Invoke(methods, null);

        myMethod = CommandFactory.GetCommandMethods("Volume Down");
        myMethod.Invoke(methods, null);

        myMethod = CommandFactory.GetCommandMethods("Volume Up");
        myMethod.Invoke(methods, null);
    }

    public static class CommandFactory
    {
        private static Dictionary<string, MethodInfo> commandMethods = new Dictionary<string, MethodInfo>();

        public static MethodInfo GetCommandMethods(string Command)
        {
            MethodInfo methodInfo;

            var myCommandMethods = new Commands();

            if (commandMethods.Count == 0)
            {
                var methodNames = typeof(Commands).GetMethods(BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Instance);

                var speechAttributeMethods = methodNames.Where(y => y.GetCustomAttributes().OfType<CommandAttribute>().Any());

                foreach (var speechAttributeMethod in speechAttributeMethods)
                {
                    foreach (var attribute in speechAttributeMethod.GetCustomAttributes(true))
                    {
                        commandMethods.Add(((CommandAttribute)attribute).CommandValue, speechAttributeMethod);
                    }
                }
                methodInfo = commandMethods[Command];
            }
            else
            {
                methodInfo = commandMethods[Command];
            }

            return methodInfo;
        }

        public class Commands
        {
            [Command("Time Please")]
            [Command("Whats the Time")]
            [Command("What Time is it")]
            public void GetTime()
            {
                Console.WriteLine(DateTime.Now.ToLocalTime());
            }

            [Command("Volume Down")]
            public void VolumeDown()
            {
                Console.WriteLine("Volume Down 1");
            }

            [Command("Volume Up")]
            public void VolumeUp()
            {
                Console.WriteLine("Volume Up 1");
            }
        }

        [System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple = true)]
        public class CommandAttribute : System.Attribute
        {
            public string CommandValue { get; set; }

            public CommandAttribute(string textValue)
            {
                this.CommandValue = textValue;
            }
        }
    }


    private void button1_Click(object sender, EventArgs e)
    {
        CommandRecognitionEngine.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(CommandRecognized);

    }

    private static void CommandRecognized(object sender, SpeechRecognizedEventArgs e)
    {
        MethodInfo myMethod;

        var methods = new Commands();//ERROR HERE: Commands is a namespace but used as a type

        myMethod = CommandFactory.GetCommandMethods(e.Result.Text);
        myMethod.Invoke(methods, null);
    }
}
}
Community
  • 1
  • 1
Rilcon42
  • 9,584
  • 18
  • 83
  • 167

2 Answers2

1

The compiler can't distinguish whether you are referring to the Class or Namespace Commands as you have a class and a namespace with the same name.

Either do one of the following

  • Refactor your class name

  • Refactor your namespace name

  • Show the compiler you mean the class Commands.Commands

RFerwerda
  • 1,267
  • 2
  • 10
  • 24
0

You have a class called Commands, but it's also in the namespace Commands, so it can't differentiate between them.

Either change the namespace, or the classname, or change that line to read:

var methods = new Commands.Commands();
Octopoid
  • 3,507
  • 5
  • 22
  • 43