我可以确定.Method.MethodHandle.GetFunctionPointer()
对于每个匿名函数都是唯一的吗?
想要做
public static T Get<T>(Func<T> getDataCallback) where T : class
{
string cacheID = getDataCallback.Method.MethodHandle.GetFunctionPointer().ToString();
var data = HttpRuntime.Cache.Get(cacheID) as T;
if (data == null)
{
data = getDataCallback();
HttpContext.Current.Cache.Insert(cacheID, data);
}
return data;
}
答案 0 :(得分:2)
我认为你的意思是匿名代表。不同的代表有不同的d.Method.MethodHandle.GetFunctonPointer()
结果,但首先我们需要定义“不同的代表”。如果两个代表引用相同的方法,则它们被认为是相同的,例如:
Action a = new Action(MyMethod);
Action b = new Action(MyMethod);
//a == b, that is, Delegate.Equals(a,b) is true
匿名代表总是不同的,即使他们看起来一样:
Action a = delegate { MyMethod(); };
Action b = delegate { MyMethod(); };
所以您的第一个问题的答案是肯定,但您的缓存可能无法按预期工作!如果您的应用程序池被回收,即使您的getDataCallback
代理保持不变,FunctionPointer值也会更改。请注意这一点。