小编Lyn*_*nxy的帖子

C#如何调用参数数量未知的方法

我在这里达到了我的技能极限.我甚至不知道这是否可行 - 但我希望是这样.

我正在制作一个命令处理程序(文本).对于每个,Add()您可以指定所需参数的数量及其类型.例如:

void Add(string commandName, int requiredParameters, params Type[] paramTypes) { }
Add("test", 2, typeof(string), typeof(int));
Run Code Online (Sandbox Code Playgroud)

所以一个示例命令是:/test hello 7.命令处理程序检查以确保类型是正确的,例如,如果第二个参数不能转换为int,它将失败.

现在我遇到的问题是我想传递一个方法Add().(如果所有检查都通过,命令处理程序将调用此方法,并使用所需参数调用它).因此,所讨论的方法可以根据传入的内容包含任意数量的参数Add().

我该如何实现这一目标?代表不起作用抱怨参数不匹配.我尝试过这样的事情:

void Add<T1, T2>(..., Action<T1, T2> method) { }
Add(..., new Action<string, int>(cmd_MyMethod));
Run Code Online (Sandbox Code Playgroud)

但我必须为很多类型创建一个Add()方法.例如Add<T1, T2, T3, T4, etc>,它也使得输入调用变得很麻烦Add().

希望作为一个字符串传递给调用的方法,然后用this.GetType().GetMethod()得到它的句柄.虽然这种方式是理想的,但是当我进行模糊处理时它会变得混乱.

有谁知道有任何方法可以做到这一点?提前致谢.

.net c# reflection visual-studio

6
推荐指数
1
解决办法
4194
查看次数

C#函数执行时异步等待

我有一个阻塞函数,它执行异步MySQL查询并在获得结果时返回结果.原因是异步是这个程序在查询期间不允许锁定.

当用户按下按钮时调用该函数,因此在第一个查询完成之前可能会多次调用该函数.我以为我可以添加一个布尔值来检查查询是否正在执行,并让函数等到它完成后再继续,但它没有按预期工作.我使用的两个DoEvents()存在一些问题.如果你注释掉任何一个,它运行得很好,除了UI冻结.

如何在执行查询时使函数执行非阻塞等待,以及在获取查询本身时执行非阻塞等待?我真的更喜欢将它保留在一个线程上,因为函数本身阻塞了调用它的代码.任何帮助将不胜感激!

    public Exception LastError;
    public MySqlConnection Conn;
    public MySqlDataReader Reader;
    public bool IsExecuting = false;

    public MySqlDataReader MySQL_Query(string Query, [Optional] params string[] Values)
    {
        while (IsExecuting)
        {
            System.Windows.Forms.Application.DoEvents();
            System.Threading.Thread.Sleep(20);
        }

        if (IsConnected() == false)
            ConnectToDatabase();

        for (int i = 0; i < Values.Length; i++)
            Values[i] = MySQL_SafeValue(Values[i]);
        if (Reader != null && Reader.IsClosed == false)
            Reader.Close();

        IsExecuting = true;
        try
        {
            MySqlCommand Cmd = new MySqlCommand(String.Format(Query, Values), Conn);
            IAsyncResult aRes = Cmd.BeginExecuteReader();
            while (!aRes.IsCompleted)
            {
                System.Windows.Forms.Application.DoEvents();
                System.Threading.Thread.Sleep(20);
            } …
Run Code Online (Sandbox Code Playgroud)

c# mysql asynchronous function blocking

0
推荐指数
1
解决办法
4695
查看次数

标签 统计

c# ×2

.net ×1

asynchronous ×1

blocking ×1

function ×1

mysql ×1

reflection ×1

visual-studio ×1