C#动态添加函数

时间:2017-05-10 14:40:24

标签: c# dynamic macros

我有一个程序与某种"宏管理器"可以(或至少应该)保存和播放宏 - 一个接一个。宏是用户可以自己选择的功能。

例如,如果用户想要创建新宏,他将执行以下步骤:

  1. 点击按钮"创建"
  2. 点击按钮"选择功能"
  3. 点击另一个按钮(按钮后面有一个功能)
  4. 播放宏
  5. 正如您所看到的,用户应该能够选择他想要动态使用的功能。

    我尝试使用代表,但我真的不理解它们(即使我已经阅读过它)

    所以这是我的代码:

    MacroManager(它保存宏并一个接一个地播放):

    namespace ControlCenter
    {
        public class ControlCenterMacroManager
        {
            public List<ControlCenterMacro> macroList = new List<ControlCenterMacro>();
            public string macroName;
    
            public void runMacroList()
            {
                Thread t = new Thread(new ThreadStart(runMacroList_t));
                t.Start();
            }
    
            public void runMacroList_t()
            {
                foreach (ControlCenterMacro macro in macroList)
                {
                    Console.Write("Playing Macro: ");
                    macro.Run();
                }
            }
    
        }
    }
    

    这将是宏:

    namespace ControlCenter
    {
        public class ControlCenterMacro
        {
            public bool isTimeout=false;
            public int timemilli=0;
            public delegate int macroAction();
            public macroAction action;
    
            public void Run()
            {
                if (isTimeout)
                {
                    Console.Write("Waiting " + timemilli + " milliseconds ");
                    Thread.Sleep(timemilli / 4);
                    Console.Write(".");
                    Thread.Sleep(timemilli / 4);
                    Console.Write(".");
                    Thread.Sleep(timemilli / 4);
                    Console.Write(".");
                    Thread.Sleep(timemilli / 4);
                    Console.WriteLine(" done");
                }
                else
                {
                    Console.WriteLine("Playing action " + action.ToString());
                    action();
                }
            }
        }
    }
    

    这是我想要放在它后面的一个可能的函数(它位于另一个项目的另一个类中):

    public int turnOn()
    {
        Console.WriteLine("Einschalten:");
        if(HomeMaticHttpRequest.sendRequest(this.url + "statechange.cgi?ise_id=" + this.RecieverId + "&new_value=true")!=null)
            return 0;
        return 1;
    }
    

    有没有人知道如何在没有太多硬编码的情况下解决这个问题? (希望保持相对动态)

1 个答案:

答案 0 :(得分:0)

这是一个简单的小例子。

宏:

public class Macro
{
    public delegate int macroAction();
    public macroAction action;

    public void Run()
    {
        action();
    }    
}

具有不同方法的容器类:

public class Container
{
    public int turnOn()
    {
        Console.WriteLine("Einschalten");
        return 1;
    }

    public int turnOff()
    {
        Console.WriteLine("Ausschalten");
        return 1;
    }
}

一个小型测试程序,它分配不同的方法:

void Main()
{       
    Container c = new Container();

    List<Macro> MacroList = new List<Macro>();

    for (int i = 0; i < 10; i++)
    {
        Macro m = new Macro();
        if (i % 2 == 0)
        {
            m.action = c.turnOn;
        }
        else
        {
            m.action = c.turnOff;
        }

        MacroList.Add(m);
    }

    foreach (var m in MacroList)
    {
        m.Run();
    }       
}

对于更一般的版本我明天要回来,要抓住我的火车;)