将 C# 中的 Func<T1, object> 转换为 Func<T1, T2>

13

我毫不怀疑这是尽可能简单易行的,但我有一个函数创建库会为我创建如下形式的lambda函数:

Func<T1, object>

我希望您能更具体地指定输出参数 - 基本上,我希望能够创建类似以下的内容:

private Func<T1, T2> GetFunc<T1, T2>(string expression)
{
    Func<T1, object> objFunc = CreateFunction(expression));
    return objFunc as Func<T1, T2>;
}

但是,当我尝试这样做时,返回了一个null(顺便说一句,如果我将objFunc作为Func<T1, object>返回,则不会返回null,因此我知道这不是我的问题所在)。

我应该如何正确实现?


顺便提一下:如果你想进行强制类型转换,那就强制转换(即(Func<T1, T2>)objFunc)。除非你有充分的理由,否则不要使用as。这样,你的语句将会快速失败并抛出InvalidCastException异常,而你也不必跟踪NullReferenceException和“检查值是否为空以知道转换是否失败”。 - Heinzi
正确地做这件事不涉及使用创建函数库,因为它会做出不稳定的事情。问题就在于那个库。 - Martijn
2个回答

16

尝试:

private Func<T1, T2> GetFunc<T1, T2>(string expression)
{
    Func<T1, object> objFunc = CreateFunction(expression));
    return arg=>(T2)objFunc(arg);
}

1
该死!!!-我就差一点了!!!-我尝试了两个输入来返回语句,这非常有道理!!-谢谢你!!! - John Bustos

10

将现有的函数调用简单地包装在另一个执行返回值强制转换的函数调用中,这样可行吗?

return t1 => (T2)objFunc(t1);

谢谢!!! - 这正是我需要的!!!! - Tyree刚刚赶上了你,但我无法感谢你提供的答案!!!! - John Bustos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接