.net 将方法转换为委托?

.net 将方法转换为委托?,.net,delegates,c#-4.0,.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 {

我想调用例如
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; }
    }
}

这是因为
MessageBox.Show(“”
是一个方法调用,而不是委托,所以

TryDo.Do(MessageBox.Show(""),null);
实际尝试调用
TryDo.Do
,结果是
MessageBox.Show
call

实际上,您需要传输一个包含您试图调用的方法的委托,因为

TryDo.Do(MessageBox.Show,null);
也将失败,错误为无法将方法转换为委托。
从方法创建委托的最简单方法是使用
Func
Action
通用委托(Func用于返回内容的方法,Action用于无效的方法),如下所示:

var myDelegate = new Func<string, DialogResult>(MessageBox.Show);
TryDo.Do(myDelegate, null)
var myDelegate=newfunc(MessageBox.Show);
TryDo.Do(myDelegate,null)
试试这个:

Delegate d = (Action)delegate { MessageBox.Show(""); };
TryDo.Do(d, null);
您的代码调用
MessageBox.Show
,然后尝试将结果传递给
TryDo

因为
MessageBox.Show
不返回
委托
,所以这不起作用

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

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

请注意,如果使用
Func
s和
Action
s的泛型重载,而不是使用
Delegate
并调用
DynamicInvoke
DynamicInvoke
的话,函数的执行速度会更快。@slaks:我可以用什么来代替呢?@slaks:我喜欢
TryDo.Do(新操作(()=>MessageBox.Show(“));
method,我应该如何更改
TryDo.Do()
以获得一个函数并运行它?我想调用类似于
TryDo.Do(Foo,args[])的东西
@HPT:如果您对特定的委托进行重载,C#将隐含地推断委托类型。@slaks:那么您的意思是我写
Do(Action)
Do(Action)
Do(Action)
。。。。还有,
Do(Func)
Do(Func)
Do(Func)
@HPT:是的,除了没有
输入
输出
,并且在方法中有泛型参数之外。正是我的观点,您传递的是方法调用的结果,而不是方法本身(MessageBox.Show返回DialogResult)
TryDo.Do(new Action(() => MessageBox.Show("")));