【问题标题】:pass a bool expression as a method parameter将 bool 表达式作为方法参数传递
【发布时间】:2015-12-26 18:44:04
【问题描述】:

尝试使用 lambda/LINQ ExpressionFunc<bool> 来简单地替换 bool 返回类型来实现更优雅的通用解决方案时,我有点困惑。

说表达式是:

public bool someBoolRetMethod(someType parA, someOtherType parB) {
    if(parA==null)
        return new ExpM("relevant msg").Rtrn;
} 

所以现在如果parAnullExpM() 是一个处理错误的类

我想要做的是将条件作为参数传递:

public class ExpBoolCond:ExpM {

    public bool Rtrn{get;set;}
    public ExpBoolCond(theBool, themsg) {
        variable to hold theBool;
        if(theBool) new specialMbxWindow(themsg)
        then set Rtrn..
    }
}

这样我就可以使用:

 var condNullParA = new ExpBoolCond(parA==null, "passed ParA is Null,\r\nAborting method <sub>(methodName and line# is handled inside  ExpM base class)</sub> !")
if(condNullParA.Rtrn) ....

实现它的正确方法是什么?

更新:

 public class ExcBCondM:ExcpM
 {
     public bool Rtrn { get { return this._Rtrn(); } }
     Func<bool> _Rtrn { get; set; }
     public ExcBCondM(Func<bool> cond, string bsMsg)
        : base(bsMsg,false)
     {
        this._Rtrn = cond;
        //if (this._Rtrn) this.show();
     }
     public bool activateNon() { this.show(); return false; }
 }

用法:

public bool someBoolRetMethod(some_passed_Type parA)
{
    var someCondExpM =  new ExpBoolCond(() => parA==null, "relevant Message");
    if(someCondExpM.Rtrn) 
    return someCondExpM.activateNon(); //if() now Calls Func<bool> _Rtrn  when called rather where stated.
  return true;//if ok...
}

【问题讨论】:

  • 一开始你还不清楚你到底想做什么。你已经得到的简单代码有什么问题? (如果您使用具有惯用名称的完整具体示例也会有所帮助......)
  • 你的问题比较乱,请重读再重写。目前它没有多大意义。
  • @JonSkeet 我只想将“简单”parA==null 条件作为参数传递,但不知道如何。如果它是有效的,为什么我不太清楚,但我以这种方式学习 lambda / LINQ ...
  • 为什么你还需要一个 lambda 表达式呢?为什么不直接制作bool 类型的参数呢?而你真的,真的需要知道为什么你想要做某事——你想要达到的目标。您不应该仅仅为了它而尝试使用 lambda 表达式和 LINQ。
  • @Robb_2015:嗯,这就是 Jbob Johan 刚刚在另一条评论中写的,然后被删除了。您是否有机会使用两个帐户的一个用户? (我的回答是:你的问题目前没有任何内容。)

标签: c# linq lambda expression func


【解决方案1】:

如果要将Func&lt;bool&gt;创建为lambda表达式,语法如下:

var condNullParA = new ExpBoolCond(() => parA==null, "passed ParA is Null,\r\nAborting method <sub>(methodName and line# is handled inside  ExpM base class)</sub> !")
//                                 ^^^^^

() =&gt; 部分告诉 C# 编译器后面的表达式应该成为不带参数的 lambda 的主体,并返回 =&gt; 符号右侧的表达式类型,即 @ 987654325@.

【讨论】:

  • 只有当我调用condNullParA.Rtrn而不是当场时才会评估 paraA=null ......?
  • 为什么要懒惰地评估这样一个简单的条件(即不立即)?
  • @JbobJohan 只有在评估theBool 时才会评估条件,这需要调用,即if(theBool())(注意这对括号)。
  • so Func&lt;Bool&gt; 是表示 if() 的“parA==null”语句的类型参数吗? ==> public ExpBoolCond( Func&lt;bool&gt; theBool, string themsg)
  • 非常感谢。那是正确的答案,唯一的问题是 () =&gt; 在那里有点烦人,但我想以任何其他方式都需要声明一个 var Func bool 语法更多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
相关资源
最近更新 更多