如何从未键入的表达式返回到键入的表达式?

时间:2012-05-29 08:58:44

标签: c# linq casting type-conversion expression

我遇到了涉及Expressions的问题。

在我的class<T>有一个字段

Dictionary<Expression, ProjectedCollection> mCache;

其中ExpressionProjectedCollection无法指定为Expression<T, S>ProjectedCollection<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()方法不适用于未键入的Expression。如果不知道S,也无法进行投射。

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

1 个答案:

答案 0 :(得分:2)

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

  • ...将此委托强制转换为其中一个Func / Action类型
  • ...使用反射检查其结构
  • ...使用Delegate.DynamicInvoke调用它