4

我刚刚遇到了一个涉及Expressions的问题。

在我class<T>有一个领域

Dictionary<Expression, ProjectedCollection> mCache;

其中ExpressionProjectedCollection不能被指定为Expression<T, S>andProjectedCollection<S>因为S在运行时它们将是不同的东西:

void AddSomething<S>(Expression<Func<T, S>> projection)
{
  if (!mCache.ContainsKey(projection))
  {
    var runnable = projection.Compile();
    var allProjected = from elm in mList
                       select runnable(elm);

    mCache.Add(projection, new ProjectedCollection<S>(allProjected));
  }
}

现在在某个我不知道的地方S,我想遍历缓存中的所有内容并将表达式应用于新事物。

foreach (KeyValuePair<Expression, ProjectedCollection> keyValuePair in mCache)
{
  // Want something like
  var func = keyValuePair.Key.Compile();
  keyValuePair.Value.SignalAdd(func(newThing));
}

但是Compile()方法不适用于 un-typed Expression。并且铸造也是不可能的而不知道S

有人知道如何解决这个问题吗?

4

1 回答 1

2

转换为 aLambdaExpression并在其上调用 Compile。它将返回一个无类型的委托。你可以...

  • ...将此委托转换为 Func/Action 类型之一
  • ...使用反射检查其结构
  • ...使用 Delegate.DynamicInvoke 调用它
于 2012-05-29T09:11:26.463 回答