C# 将布尔表达式作为方法参数传递
尝试使用C# 将布尔表达式作为方法参数传递,c#,linq,lambda,expression,func,C#,Linq,Lambda,Expression,Func,尝试使用lambda/LINQExpression或Func简单地替换bool返回类型来实现更优雅的通用解决方案时,我有点困惑 假设表达式是: public bool someBoolRetMethod(someType parA, someOtherType parB) { if(parA==null) return new ExpM("relevant msg").Rtrn; } 所以现在如果parA是null,ExpM()是一个处理错误的类 我想做的是将条件作为
lambda
/LINQ
Expression
或Func
简单地替换bool
返回类型来实现更优雅的通用解决方案时,我有点困惑
假设表达式是:
public bool someBoolRetMethod(someType parA, someOtherType parB) {
if(parA==null)
return new ExpM("relevant msg").Rtrn;
}
所以现在如果parA
是null
,ExpM()
是一个处理错误的类
我想做的是将条件作为参数传递:
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) ....
var condNullParA=new ExpBoolCond(parA==null,“传递的parA为null,\r\n终止方法(methodName和line#在ExpM基类内处理)!”)
如果(第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; }
}
公共类ExcBCondM:ExcpM
{
public bool Rtrn{get{返回这个。_Rtrn();}
Func_Rtrn{get;set;}
public ExcBCondM(funct-cond,字符串bsMsg)
:base(bsMsg,false)
{
这个。_Rtrn=cond;
//如果(this.Rtrn)this.show();
}
public bool activateNon(){this.show();返回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...
}
public bool someBoolRetMethod(some_passed_Type parA)
{
var someCondExpM=new ExpBoolCond(()=>parA==null,“相关消息”);
if(someCondExpM.Rtrn)
返回someCondExpM.activateNon();//if()现在在调用时调用Func _Rtrn,而不是在指定的位置。
返回true;//如果确定。。。
}
如果要将Func
创建为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> !")
// ^^^^^
var condNullParA=new ExpBoolCond(()=>parA==null,“传递的参数为null,\r\n终止方法(methodName和line#在ExpM基类内处理)!”)
// ^^^^^
()=>
部分告诉C#编译器,后面的表达式应该成为不带参数的lambda体,并返回=>
符号右侧的表达式类型,即bool
您首先要做的事情非常不清楚。您已有的简单代码有什么问题?(如果你能用一个完整的具体例子和习惯用法的名字也会有帮助……)你的问题很混乱,请重读并重写。目前它没有多大意义。@JonSkeet我只想将“简单的”parA==null
条件作为参数传递,不知道如何传递。为什么我不太清楚它是否有效,但我是通过这种方式学习lambda/LINQ的……但是为什么需要lambda表达式呢?为什么不直接将参数设置为bool
?你真的,真的需要知道你为什么要做一些事情——你想实现什么。你不应该仅仅为了使用lambda表达式和LINQ。@Robb_2015:嗯,这是Jbob Johan在另一条评论中写的,然后被删除。您是否有可能是两个帐户上的一个用户?(我的回答是:你的问题目前没有任何这方面的内容。)这样,只有在我调用condNullParA.Rtrn
时才会计算parA=null,而不是在现场…?你为什么要懒洋洋地(即不立即)计算这样一个简单的条件?@JbobJohan只有在计算theBool
时才会计算条件,这需要调用,即if(theBool())
(注意括号对)。因此Func
是表示if()的“parA==null”状态的类型参数?=><代码>公共ExpBoolCond(Func theBool,string themsg)非常感谢。这是正确的答案,唯一的问题是()=>
有点烦人,但我想在其他方面,我们需要声明一个var Func bool,它更符合语法