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

Posted

技术标签:

【中文标题】C# 将 Func<T1, object> 转换为 Func<T1, T2>【英文标题】:C# Convert Func<T1, object> to Func<T1, T2> 【发布时间】:2015-11-11 17:43:24 【问题描述】:

我毫不怀疑这是尽可能容易做到的,但我有一个函数创建器库,可以为我创建以下形式的 lambda 函数:

Func<T1, object>

我希望更具体地指定 out 参数 - 基本上,我希望能够创建以下内容:

private Func<T1, T2> GetFunc<T1, T2>(string expression)

    Func<T1, object> objFunc = CreateFunction(expression));
    return objFunc as Func<T1, T2>;

但是,当我尝试这个时,我会返回一个 null(顺便说一句,如果我将 objFunc 作为 Func&lt;T1, object&gt; 返回它不是空值,所以我知道这不是我的问题所在)。

我该如何正确地做到这一点?

【问题讨论】:

旁注:如果你想投,那么投(即(Func&lt;T1, T2&gt;)objFunc)。不要使用as,除非您有充分的理由这样做。这样一来,您的语句将很快以 InvalidCastException 失败,并且您不必跟踪 NullReferenceExceptions 并“检查值是否为 null 以了解强制转换是否失败”。 正确执行此操作将涉及不使用执行此类不合理事情的函数创建库。问题出在那个库中。 【参考方案1】:

试试:

private Func<T1, T2> GetFunc<T1, T2>(string expression)

    Func<T1, object> objFunc = CreateFunction(expression));
    return arg=>(T2)objFunc(arg);

【讨论】:

该死!!! - 我是如此接近!!!! - 我为 return 语句尝试了 2 个输入,这很有意义! - 谢谢!!!!【参考方案2】:

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

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

【讨论】:

谢谢!!! - 这正是我需要的!!!! - Tyree 刚刚击败了你,但我不能感谢你的回答!!!!

以上是关于C# 将 Func<T1, object> 转换为 Func<T1, T2>的主要内容,如果未能解决你的问题,请参考以下文章

用委托 C# 替换 Func

从 c# 表达式中删除不需要的装箱转换

Func<DomainObject,object> 如何将对象名称作为字符串返回 [重复]

C# 如何将 Expression<Func<SomeType>> 转换为 Expression<Func<OtherType>>

Action 和 Func

c# 拼接lambda表达式