方法名称ToString()

时间:2011-07-13 08:38:24

标签: c# .net-4.0

GetCached(BLCustomer.GetAll, "GetAll");

其中"GetAll"是会话密钥。 我怎么能这样做?

GetCached(BLCustomer.GetAll, BLCustomer.GetAll.ToString());

更新

其他世界我想从方法名"GetAll"获取字符串 BLCustomer.GetAll()(不是客户名称,但方法名称)。

我想用这样的东西

GetCached(BLCustomer.GetSingle, BLCustomer.GetSingle.ToString());

而不是

GetCached(BLCustomer.GetSingle, "GetSingle");

避免硬编码方法名称。

2 个答案:

答案 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));

这种方法有两个假设:

  1. 调用总是需要在示例中看起来,即它必须没有参数,并且委托的主体必须只包含您想要名称的方法而不包含任何其他内容
  2. 您希望名称来自的方法不得为void类型,且不得包含任何参数。
  3. 您也可以将此用于非静态方法:

    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)