有可能延迟&#34; bool&#34;在词典中测试<string,func <bool,=“”object =“”>&gt;

时间:2017-02-24 19:47:17

标签: c# dictionary lambda expression expression-trees

我有一个Dictionary<string, Func<bool, object>>我想有条件地遍历字典并添加&#34;对象&#34;仅在bool == true 但我不确定如何将pair.Value()作为布尔传递。

foreach (KeyValuePair<string, Func<bool, object>> pair in parameters)
{   
    //error pair.Value(), Delegate Func has 1 parameter(s) but is invoked with 0 arguments.  
    //pair.Value(true) obviously works, but defeats the purpose

    if (pair.Value() != null)
            cmd.Parameters.AddWithValue(pair.Key, pair.Value());
    } 
}

我应该使用Expression<Func<bool, object>>并编译/评估bool。如果是这样,怎么样?

1 个答案:

答案 0 :(得分:1)

我明白了你想要存储一个条件,这个条件将在你去拉它时解决,所以你真正需要的就是这种字典

Dictionary<string, Func<object>> dictionary= new Dictionary<string, Func<object>>()

你会添加这样的条目

dictionary.Add("key", () => /*Insert your condition here*/ 3 == 2 ? /*If True*/ obj : /*If False*/ null );

然后您的代码完美运行

foreach (KeyValuePair<string, Func<object>> pair in dictionary)
{     
    if (pair.Value() != null)
    cmd.Parameters.AddWithValue(pair.Key, pair.Value());
}

修改

优秀,这里有2个选项:

选项1

你制作这个词典

var dictionary = new Dictionary<string, Action<bool>>();

然后你这样添加

dictionary.Add("key", condition => { if (condition) cmd.Parameters.AddWithValue("key", obj); });

现在你的逻辑变成了这个

foreach (KeyValuePair<string, Action<bool>> pair in dictionary)
            pair.Value(bool);

选项2

看起来你真正想要的是这个

var list = new List<Action<bool>>();
list.Add(condition => { if (condition) cmd.Parameters.AddWithValue("key", obj) });

然后你的逻辑就像这样

list.ForEach(x => x(bool));