【问题标题】:C# add function dynamicallyC#动态添加函数
【发布时间】:2017-05-10 14:40:24
【问题描述】:

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

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

  1. 点击“创建”按钮
  2. 点击“选择功能”按钮
  3. 单击另一个按钮(该按钮后面包含一个功能)
  4. 播放宏

如您所见,用户应该能够动态选择他想要使用的功能。

我尝试使用委托,但我并不真正理解它们(尽管我已经阅读过)

这是我的代码:

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;
}

有谁知道我如何在不进行过多硬编码的情况下解决这个问题? (希望保持相对动态)

【问题讨论】:

  • 宏是预定义的功能吗?用户是否应该为宏设置任何参数?
  • 可能的功能有哪些限制?他们有返回值吗?还是有些类型无效?他们有参数吗?
  • 您甚至可以使用纯 C# 编写脚本,您可以使用 CodeDom 生成即时代码,将其编译到程序集中并存储起来,以便您可以多次重复使用想要。
  • 我的回答够笼统,还是你还需要更笼统?
  • @MongZhu 很抱歉我没有回答 - 一个星期没有笔记本电脑。这个答案很有帮助,所以是的,不需要更通用的atm :) ty 来帮助我

标签: c# dynamic macros


【解决方案1】:

这是一个精简到其基本要素的小示例。

宏:

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();
    }       
}

对于更通用的版本,我明天必须回来,得赶上我的火车;)

【讨论】:

    猜你喜欢
    • 2011-02-16
    • 2016-06-15
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    相关资源
    最近更新 更多