получить возвращаемое значение с помощью DynamicInvoke или универсального делегата - PullRequest
1 голос
/ 01 августа 2011

Я пытаюсь создать класс с именем SurroundJob, который принимает Func

, но выполнение входящего метода не является его целью, задача SurroundJob - делать определенные предопределенные вещи до и после вызова входящего метода

однако у меня возникли проблемы с получением возвращаемого значения входящего метода, чтобы я мог передать его вызывающему классу: (

сначала добавляется вызывающий класс, затем требуемый, но в настоящее время не- функциональный класс 'surrounder' и, наконец, исключение из-за метода неуместной попытки приведения (TResult). DynamicInvoke (param)

Класс вызова

class ACoreJob
{

    public void DoMyJob()
    {
        SurroundJob.CoreJobs<Boolean, string> coreJob = DoCoreJob;
        Boolean success = false;
        SurroundJob.Embed<Boolean, string>(ref success, "facebook.com", coreJob);
        if (success) Trace.WriteLine("Wicked without exceptions");
    }

    Boolean DoCoreJob(string Target)
    {
        Boolean isHappy = false;
        Process.Start(@"http://" + Target);
        isHappy = true;
        return isHappy;
    }

}

Класс в фокусе

class SurroundJob
{

    public delegate TResult CoreJobs<TResult, T>(T param);

    public static void Embed<TResult,T>(ref TResult result,T param, Delegate method)
    {
        if (method != null)
        {
             MethodInfo methodInfo = method.Method;
             result = default(TResult);
             try
             {
                 Log(methodInfo.Name + " Start");
                 result = (TResult)method.DynamicInvoke(param);                     
             }
             catch (Exception e)
             {
                 Troubleshoot(methodInfo.Name, e);
             }
        }
    }

Исключение

В строке: result = (TResult) method.DynamicInvoke (param);

DoCoreJob Проблема: Невозможно привести объект типа 'ACoreJob' к типу'Boolean'.

Я новичок в этом мире и действительно не знаю, как взаимодействовать с DynamicInvoke, чтобы получить возвращаемое значение?

илиЕсть еще один способ достичь моей цели?

искренне спасибо!

1 Ответ

1 голос
/ 01 августа 2011

Вот простой пример использования Func<T, TResult>:

void Main()
{
    bool success = false;
    SurroundJob.Embed(ref success, "facebook.com", DoCoreJob);
}

Boolean DoCoreJob(string Target)
{
    Boolean isHappy = false;
    Console.WriteLine(@"http://" + Target);
    isHappy = true;
    return isHappy;
}

class SurroundJob
{
    public static void Embed<T, TResult>(ref TResult Result, T param,  Func<T, TResult> method)
    {
        if(method != null)
        {
            try
            {
                Log(param.ToString());
                Result = method(param);
            }
            catch(Exception e)
            {
                Troubleshoot(param.ToString(), e);
            }
        }
    }

    public static void Log(string s)
    {
        Console.WriteLine("Log: " + s);
    }

    public static void Troubleshoot(string s, Exception e)
    {
        Console.WriteLine("Troubleshoot: " + s);
        Console.WriteLine(e.ToString());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...