我想打电话给例如TryDo.Do(MessageBox.Show(""), null);
我该怎么做?
using System;
namespace TryCatchHandlers
{
public static class TryDo
{
public static CallResult Do(Delegate action, params object[] args)
{
try
{
return new CallResult (action.DynamicInvoke(args), action.Method.ReturnType, true);
}
catch
{
return new CallResult(null, null, false);
}
}
}
public class CallResult
{
public CallResult() { }
internal CallResult(object result, Type resultType, bool isSuccessful)
{
Result = result;
ResultType = resultType;
IsSuccessful = isSuccessful;
}
public object Result { get; private set; }
public Type ResultType { get; private set; }
public bool IsSuccessful { get; private set; }
}
}
答案 0 :(得分:3)
您的代码调用MessageBox.Show
,然后尝试将结果传递给TryDo
。
由于MessageBox.Show
未返回Delegate
,因此无效。
相反,您应该传递Show
方法本身以及参数:
TryDo.Do(new Func<string, DialogResult>(MessageBox.Show), "");
或者,您可以传递一个调用函数的匿名方法:
TryDo.Do(new Action(() => MessageBox.Show("")));
请注意,如果您进行了Func
和Action
s而不是Delegate
并调用DynamicInvoke
的通用重载,那么您的函数执行速度会更快。
答案 1 :(得分:1)
试试这个:
Delegate d = (Action)delegate { MessageBox.Show(""); };
TryDo.Do(d, null);
答案 2 :(得分:0)
这是因为MessageBox.Show("")
是方法调用,而不是委托,所以
TryDo.Do(MessageBox.Show(""),null);
实际上尝试使用TryDo.Do
调用的结果来调用MessageBox.Show
。
您实际上需要传输包含您尝试调用的方法的委托,因为
TryDo.Do(MessageBox.Show,null);
也会失败,错误表示无法将方法强制转换为委托。
从方法创建委托的最简单方法是使用Func<..>
和Action<...>
泛型委托(对于那些返回内容的方法使用Func,对于那些无效的方法使用Action),如下所示:
var myDelegate = new Func<string, DialogResult>(MessageBox.Show);
TryDo.Do(myDelegate, null)