2010-06-21 45 views
6

我想使用Linq Expressions构建一个Lambda表达式,该表达式可以使用String索引访问“属性包”样式字典中的项目。我正在使用.Net 4如何使用Linq表达式访问字典项目

static void TestDictionaryAccess() 
    { 
     ParameterExpression valueBag = Expression.Parameter(typeof(Dictionary<string, object>), "valueBag"); 
     ParameterExpression key = Expression.Parameter(typeof(string), "key"); 
     ParameterExpression result = Expression.Parameter(typeof(object), "result"); 
     BlockExpression block = Expression.Block(
      new[] { result },    //make the result a variable in scope for the block 
      Expression.Assign(result, key), //How do I assign the Dictionary item to the result ?????? 
      result       //last value Expression becomes the return of the block 
     ); 

     // Lambda Expression taking a Dictionary and a String as parameters and returning an object 
     Func<Dictionary<string, object>, string, object> myCompiledRule = (Func<Dictionary<string, object>, string, object>)Expression.Lambda(block, valueBag, key).Compile(); 

     //-------------- invoke the Lambda Expression ---------------- 
     Dictionary<string, object> testBag = new Dictionary<string, object>(); 
     testBag.Add("one", 42); //Add one item to the Dictionary 
     Console.WriteLine(myCompiledRule.DynamicInvoke(testBag, "one")); // I want this to print 42 
    } 

在上述测试方法中,我想将Dictionary项值即testBag [“one”]赋值给结果。请注意,我已将传入的密钥字符串分配给结果以演示分配呼叫。

回答

10

您可以使用以下方法来访问的Dictionary

Expression.Property(valueBag, "Item", key) 

Item属性下面是代码的变化是应该做的伎俩。

ParameterExpression valueBag = Expression.Parameter(typeof(Dictionary<string, object>), "valueBag"); 
ParameterExpression key = Expression.Parameter(typeof(string), "key"); 
ParameterExpression result = Expression.Parameter(typeof(object), "result"); 
BlockExpression block = Expression.Block(
    new[] { result },    //make the result a variable in scope for the block   
    Expression.Assign(result, Expression.Property(valueBag, "Item", key)), 
    result       //last value Expression becomes the return of the block 
); 
+0

谢谢克里斯,这是一种享受。 – 2010-06-22 03:03:12