GetCached(BLCustomer.GetAll, "GetAll");
其中"GetAll"
是会话密钥。
我怎么能这样做?
GetCached(BLCustomer.GetAll, BLCustomer.GetAll.ToString());
更新
其他世界我想从方法名"GetAll"
获取字符串 BLCustomer.GetAll()
(不是客户名称,但方法名称)。
我想用这样的东西
GetCached(BLCustomer.GetSingle, BLCustomer.GetSingle.ToString());
而不是
GetCached(BLCustomer.GetSingle, "GetSingle");
避免硬编码方法名称。
答案 0 :(得分:4)
像这样更改GetCached:
ReturnType GetCached(SomeFunc f)
{
var methodname = f.Method.Name;
// add rest of code
}
<强>假设:强>
我猜GetCached
目前看起来像这样:
T GetCached<T>(Func<T> accessor, string name)
{
...
}
鉴于accessor
已经是委托,名称可以如上所示确定。
如果没有,我的建议将不起作用。
以上还假设BLCustomer.GetSingle
是一种方法(实例或静态应该没问题)。
电话会是:
var r = GetCached(BLCustomer.GetSingle); // delegate implicitly created
答案 1 :(得分:3)
简单解决方案(从下面的leppie中偷来)
只需从GetCached
方法中删除第二个参数:
ReturnType GetCached(Func<T> func)
{
var name = func.Method.Name;
// execute func here
}
这假设它将被这样调用:
GetCached(BLCustomer.GetAll);
而不是这样:
GetCached(() => BLCustomer.GetAll());
复杂解决方案:
你可以这样做:
string GetMethodName(Expression<Func<Func<dynamic>>> methodExpression)
{
dynamic memberExpression = methodExpression.Body;
MethodInfo result = memberExpression.Operand.Arguments[2].Value;
return result.Name;
}
这样称呼:
GetCached(BLCustomer.GetSingle, GetMethodName(() => BLCustomer.GetSingle));
这种方法有两个假设:
void
类型,且不得包含任何参数。您也可以将此用于非静态方法:
BLCustomer customer = new BLCustomer();
GetCached(customer.GetSingle, GetMethodName(() => customer.GetSingle));
您甚至可以将GetCached
更改为以下内容以清除其API:
ReturnType GetCached<T>(Expression<Func<Func<T>>> methodExpression)
{
var name = GetMethodName(methodExpression);
var func = methodExpression.Compile()();
// execute func and do stuff
}
要实现此目的,您需要GetMethodName
通用而非使用dynamic
:
string GetMethodName<T>(Expression<Func<Func<T>>> methodExpression)
{
dynamic memberExpression = methodExpression.Body;
MethodInfo result = memberExpression.Operand.Arguments[2].Value;
return result.Name;
}
然后你可以这样称呼它:
GetCached<IEnumerable<Customer>>(() => BLCustomer.GetAll)
GetCached<Customer>(() => BLCustomer.GetSingle)