【问题标题】:How do I evalulate a Func / Delegate / Expression passed as parameter to method?如何评估作为参数传递给方法的 Func / Delegate / Expression?
【发布时间】:2014-06-09 02:53:56
【问题描述】:

我想写一个扩展方法来运行某个对象的方法,并返回执行过程中发生的异常(如果有的话)。

换句话说,将 myObject.Foo() 的动态设置为 anyObject.AnyMethod(...)。

Exception incurredException = null;
try 
{
    myObject.Foo();
}
catch(Exception e)
{
    incurredException = e;
}

return incurredException;

到这里:

Exception e = IncurredException( () => myObject.Foo() );

我不知道 Func、Expression、Delegate 等在这里是否合适。想法?谢谢!

【问题讨论】:

  • 您在那里做的事情将是最简单的Action。如果方法有返回类型,你想做什么?

标签: c# .net lambda delegates func


【解决方案1】:

假设你不关心返回类型,你需要这样的东西:

public static Exception IncurredException(Action action)
{
    try
    {
        action();
    }
    catch (Exception e)
    {
        return e;
    }

    return null;
}

然后您可以根据需要调用它:

Exception e = IncurredException( () => myObject.Foo() );

或者更简洁一点,使用var 和方法组语法:

var e = IncurredException(myObject.Foo);

【讨论】:

  • 内联incurredException 变量可能会更好,只会在那里造成混乱。 catch 的主体将是 return e,或者更好 - 重命名 e 变量。另外,请对 swallowing all 发生的异常作为错误的设计决策进行一些描述。
  • @IlyaIvanov:同意你的内联-更新。不过对吞咽部分不太确定?我看不到任何证据表明 OP 打算吞下任何例外。
  • 返回异常和抛出异常是两种不同的情况。以前,返回值表示 C 或 C++ 中可能存在的错误。我远不是该领域的专家,但据我所知,这就是首先引入异常的原因。
  • @IlyaIvanov:感谢您的澄清。我明白你的意思了。我有点假设 OP 计划检查异常,然后根据需要重新抛出。也许这一点最好留在评论中,因为它是问题本身的外围设计建议。但是,如果您不这么认为,请随时编辑我的答案。
  • 不打算编辑它,只是想要一些关于这种方法的 cmets 或警告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多