Method name ToString()
本文关键字:ToString name Method | 更新日期: 2023-09-27 18:01:51
GetCached(BLCustomer.GetAll, "GetAll");
,其中"GetAll"
为会话密钥。我怎么能做这样的事?
GetCached(BLCustomer.GetAll, BLCustomer.GetAll.ToString());
更新:
我想从方法名BLCustomer.GetAll()
中获得字符串 "GetAll"
(不是客户名称,而是方法名称)
我想用这样的东西
GetCached(BLCustomer.GetSingle, BLCustomer.GetSingle.ToString());
代替
GetCached(BLCustomer.GetSingle, "GetSingle");
像这样更改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
简单的解决方案:(从下面的leppie偷来的)
只需从GetCached
方法中删除第二个参数:
ReturnType GetCached(Func<T> func)
{
var name = func.Method.Name;
// execute func here
}
这里假设它将被这样调用:
GetCached(BLCustomer.GetAll);
而不是像这样:
GetCached(() => BLCustomer.GetAll());
COMPLEX SOLUTION:
你可以这样做:
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)