【问题标题】:Get name of a method strongly typed获取强类型方法的名称
【发布时间】:2013-09-14 09:20:59
【问题描述】:

认为我有一个像下面这样的课程:

public class Foo
{
    public int Bar { get; set; }

    public int Sum(int a, int b)
    {
        return a + b;
    }

    public int Square(int a)
    {
        return a * a;
    }
}

你知道我可以编写一个返回给定属性名称的方法:

var name = GetPropertyName<Foo>(f => f.Bar); //returns "Bar"

GetPropertyName 方法可以很容易地实现如下:

public static string GetPropertyName<T>(Expression<Func<T, object>> exp)
{
    var body = exp.Body as MemberExpression;
    if (body == null)
    {
        var ubody = (UnaryExpression)exp.Body;
        body = ubody.Operand as MemberExpression;
    }
    return body.Member.Name;
}

但我想像下面的属性名称一样轻松地获取方法名称:

var name1 = GetMethodName<Foo>(f => f.Sum); //expected to return "Sum"
var name2 = GetMethodName<Foo>(f => f.Square); //expected to return "Square"

这样的GetMethodName方法可以写吗?

注意:GetMethodName 必须独立于给定方法的签名或返回值。

【问题讨论】:

  • 您是否有机会事先知道方法f.Sum,但仍想在另一个方法中传递它,只返回字符串"Sum"?这根本没有意义。
  • Foo.Sum代替f =&gt; f.Sum
  • @leppie 它的签名与Func&lt;T, object&gt;不兼容
  • @IlyaIvanov:所以重载GetMethodName(对于所有变化;p)

标签: c# reflection lambda


【解决方案1】:

经过一番研究,我发现Expression&lt;Action&lt;T&gt;&gt; 应该足以满足您的需求。

private string GetMethodName<T>(Expression<Action<T>> method)
{
    return ((MethodCallExpression)method.Body).Method.Name;
}

public void TestMethod()
{
    Foo foo = new Foo();
    Console.WriteLine(GetMethodName<Foo>(x => foo.Square(1)));
    Console.WriteLine(GetMethodName<Foo>(x => foo.Sum(1,1)));
    Console.ReadLine();
}

public class Foo
{
    public int Bar { get; set; }

    public int Sum(int a, int b)
    {
        return a + b;
    }

    public int Square(int a)
    {
        return a * a;
    }
}

【讨论】:

  • 现在将SayHello 放入不同的类或尝试使用不同签名的方法
  • GetMethodName(person.SayHello) 返回"SayHello"
  • 使用法更烦人,因为您现在需要声明该类型的变量。不同方法签名和重载决议之间的交互也很丑陋。
  • @WillFaithfull 感谢您的回答。这是迄今为止最好的解决方案。但是,确实,这不是我想要的。这种方法需要将虚拟值传递给该方法,但它似乎有点糟糕。如果可能的话,最好只写 Console.WriteLine(GetMethodName(x => foo.Sum));但在我看来是不可能的。
猜你喜欢
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多