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");

Method name ToString()

像这样更改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));

这个方法有两个假设:

  1. 调用总是需要看起来像在例子中,也就是说,它不能有一个参数,委托的主体必须只包含你想要的名字来自的方法,而不是其他
  2. 你想要的方法名不能是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)