Преобразовать метод в делегат? - PullRequest
3 голосов
/ 20 декабря 2010

Я хочу позвонить, например, 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 ]

3 голосов
/ 20 декабря 2010

Ваш код вызывает MessageBox.Show, затем пытается передать результат в TryDo.
Поскольку MessageBox.Show не возвращает Delegate, это не сработает.

Вместо этого вы должны передать сам метод Show вместе с параметром:

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

В качестве альтернативы, вы можете передать анонимный метод, который вызывает функцию:

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

Обратите внимание, что ваша функция будет работать быстрее, если вы сделаете общие перегрузки, которые принимают Func с и Action с вместо взятия Delegate и вызова DynamicInvoke.

1 голос
/ 20 декабря 2010

Попробуйте это:

Delegate d = (Action)delegate { MessageBox.Show(""); };
TryDo.Do(d, null);
0 голосов
/ 20 декабря 2010

Это потому, что 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...