【问题标题】:get return value with DynamicInvoke or generic delegate使用 DynamicInvoke 或通用委托获取返回值
【发布时间】:2011-08-01 23:29:03
【问题描述】:

我正在尝试创建一个接受 Func 的名为 SurroundJob 的类

但是执行传入的方法并不是它的目的,SurroundJob 的任务是在调用传入的方法之前和之后做一些预定义的事情

但是,我无法获取传入方法的返回值,因此我可以将其传递给调用类:(

首先附加调用类, 然后是想要的,但目前没有功能的“环绕者”类 最后是由于不适当的强制转换尝试导致的异常 (TResult)method.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 交互以获得返回值?

或者还有其他方法可以实现我的目标吗?

衷心感谢!

【问题讨论】:

  • 为什么当Func&lt;T, TResult&gt;已经在框架中时,你不仅决定创建自己的委托类型,还决定改变操作数的顺序?
  • 您记录的异常谈到了您在问题的其他地方没有提到的两种类型。也不清楚为什么您使用 Delegate,而您显然希望它接受 T 并返回 TResult - 为什么不将方法参数更改为 CoreJobs&lt;TResult, T&gt;
  • 我刚刚复制并粘贴了您的代码,但没有发现任何异常,因此您可能需要查看您发布的问题之外的内容。

标签: c# generics delegates


【解决方案1】:

这是一个使用Func&lt;T, TResult&gt;的简单示例:

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());
    }
}

【讨论】:

  • 当使用 Func 作为 Embed 的参数时,正是这种不直截了当的方式试图找到一个解决方案,这让我想到了 DynamicInvoke,它确实创造了奇迹!谢谢你!我不知道我可以跳过 DoMyJob() 中的 coreJob 和 规范!
  • 顺便问一下,这种重复的 Fixed PreTasks > Variable CoreTask > Fixed PostTasks 问题是否与任何标记的设计模式有关?
  • 我不是 100% 确定,所以这可能最好留给另一个问题。
  • 原来这种尝试是Aspect Oriented Programming 的基本形式,例如,可以使用PostSharpUnity 更巧妙地实现!
猜你喜欢
  • 2021-02-22
  • 2014-01-10
  • 1970-01-01
  • 2014-01-15
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多