我正在尝试找到一种解决方案,该解决方案允许我在窗体项目中编写一个方法,该方法可以从类库项目中可变地调用多个不同的方法。
之所以这样,是因为我想围绕这些方法实现重试逻辑,并防止自己针对每种不同的方法重复执行该逻辑。关于类库方法的唯一一致之处是它们都返回Task<bool>
,因此很容易等待并执行逻辑。
到目前为止,我有以下内容:
public async Task Runner(string methodName, params object[] parameters)
{
ThreadTimer.Start();
var tries = 0;
var ok = false;
while (tries <= 180)
{
try
{
var parameterTypes = (from p in parameters select p.GetType()).ToArray();
var mi = typeof(string).GetMethod(methodName, parameterTypes); //Currently returns null
var result = (Task<bool>)mi.Invoke(null, parameters);
ok = await result;
if (ok) break;
}
catch (Exception ex)
{
if (ex.InnerException == null)
{
ExceptionLabel2.Text = ex.Message;
}
else
{
ExceptionLabel1.Text = ex.Message;
ExceptionLabel2.Text = ex.InnerException.Message;
}
}
finally
{
tries++;
}
}
if (ok)
{
ThreadTimer.Dispose();
}
else
{
CShellControls.ExitWindowsEx(0, 0); //Logoff
}
}
其背后的想法是在字符串中声明一个方法名称,并随其传递一个参数数组。然后,我使用.GetMethod()
尝试获取所需的方法信息,但不幸的是,这返回了null
。
我尝试了几种不同的方法,但是我愿意接受建议和批评。就优化代码而言,我还没有真正考虑它,我只是想先尝试使其工作,然后再采用一种更有效的方法。
提前谢谢!