我有我使用的檢查方法的參數,這在窗體調用類:緩存編譯<Func<T>>
public void SomeMethod(string anArg)
{
Ensure.ArgumentNotNull(() => anArg);
}
如果參數爲null,則一個ArgumentNullException
與屬性的名稱被拋出。這是這樣做的:
public static void ArgumentNotNull<T>(Expression<Func<T>> expression) where T : class
{
var value = expression.Compile()();
if (value == null)
{
throw new ArgumentNullException(expression.GetMemberName());
}
}
其中GetMemberName
是我寫的擴展方法。
我遇到的問題是,編譯的調用非常慢,所以我想緩存結果,但我似乎無法拿出一個獨特的緩存鍵足以防止緩存衝突,但不是如此唯一以至於緩存變得無效。
我最大的努力迄今:
internal static class ExpressionCache<T>
{
private static readonly Dictionary<string, Func<T>> Cache = new Dictionary<string, Func<T>>();
public static Func<T> CachedCompile(Expression<Func<T>> targetSelector)
{
Func<T> cachedFunc;
var cacheKey = targetSelector + targetSelector.Body.ToString();
if (!Cache.TryGetValue(cacheKey, out cachedFunc))
{
cachedFunc = targetSelector.Compile();
Cache[cacheKey] = cachedFunc;
}
return cachedFunc;
}
}
但是,這仍然會導致緩存鍵衝突。什麼可能是更好的方法?
我會使用PostSharp或IL:http://abdullin.com/journal/2008/12/19/how-to-get-parameter-name-and-argument-value-from-c-lambda- v.html – 2011-02-15 10:22:16
@Ruben,你是對的,我在發佈之前在瀏覽器中進行了一些攻擊。我會糾正它。 – ilivewithian 2011-02-15 10:23:12