将方法转换为Delegate?

时间:2010-12-20 15:04:28

标签: .net delegates c#-4.0

我想打电话给例如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; }
    }
}

3 个答案:

答案 0 :(得分:3)

您的代码调用MessageBox.Show ,然后尝试将结果传递给TryDo
由于MessageBox.Show未返回Delegate,因此无效。

相反,您应该传递Show方法本身以及参数:

TryDo.Do(new Func<string, DialogResult>(MessageBox.Show), "");

或者,您可以传递一个调用函数的匿名方法:

TryDo.Do(new Action(() => MessageBox.Show("")));

请注意,如果您进行了FuncAction 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)