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