2015-12-26 5 views
2

я немного запутался, пытаясь реализовать более элегантное решение с использованием общего lambda/LINQExpression или Func<bool> просто заменить тип 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) .... 

Каков правильный способ его реализации?

Update:

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... 
} 
+2

Непонятно, что именно вы пытаетесь сделать в первую очередь. Что случилось с простым кодом, который у вас уже есть? (Это также помогло бы, если бы вы использовали полный конкретный пример с идиоматическими именами ....) –

+0

Ваш вопрос довольно хаотичен, пожалуйста, перечитайте его и перепишите. В настоящее время это не имеет большого смысла. –

+0

@JonSkeet Я просто хочу передать «простое» условие 'parA == null' в качестве параметра и не знаю, как это сделать. почему для меня это не совсем понятно, если он эффективен, но я изучаю lambda/LINQ таким образом ... –

ответ

2

Если вы хотите создать Func<bool> как лямбда-выражения, синтаксис выглядит следующим образом:

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

() => часть говорит C#, что следующее выражение должно стать телом a la mbda, которая не принимает параметров и возвращает все, что является типом выражения справа от знака =>, то есть bool.

+0

, и таким образом parA = null будет оцениваться только тогда, когда я буду называть 'condNullParA.Rtrn', а не на месте ...? –

+1

Почему вы должны оценивать такое простое условие лениво (т. Е. Не сразу)? – JohnB

+0

@JbobJohan Условие будет оцениваться только тогда, когда вычисляется 'theBool', для которого требуется вызов, то есть' if (theBool()) '(обратите внимание на пару круглых скобок). – dasblinkenlight