我刚碰到涉及Expressions的问题。如何从无类型的表达式返回到键入的表达式?
在我class<T>
有一个字段
Dictionary<Expression, ProjectedCollection> mCache;
其中两个Expression
和ProjectedCollection
不能被指定为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
,铸造也是不可能的。
有没有人有一个想法如何解决这个问题?
您的方法存在问题...'Expression'不会覆盖'Equals'和'GetHashCode',因此将其用作字典键将不起作用。两个相同的表达式不会被认为是相等的...... –
顺便说一句,'Compile'方法在'LambdaExpression'中可用,它是'Expression'的基类。但它返回一个无类型委托... –
@ThomasLevesque:这是由自定义的'IEqualityComparer'解决。 – primfaktor