我剛碰到涉及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