在C#中动态获取方法名称的最简单,最便宜的方法是什么?

时间:2013-08-14 11:42:21

标签: c# reflection .net-4.5

我想将一个mathod名称放入一个字符串中,但我也不想使用硬编码值。相反,我想通过反思动态地获得名称。我使用了以下工作声明:

"The method is called " + new Action(MyMethod).Method.Name;

我认为创建Action委托在语义上是不合适的。它建议会有一个方法调用,但相反,会有一个反射。我正在为类寻找类似 typeof 运算符或 GetType 的东西,但是在方法级别。

模式Delegate.Method.Name是否是实现目标的最佳和标准方法?


我的意思是非当前的方法。

4 个答案:

答案 0 :(得分:2)

MethodInfo.CurrentMethod应该为您提供当前方法的名称

"The method is called " + MethodInfo.GetCurrentMethod().Name;

答案 1 :(得分:1)

使用MethodBase.GetCurrentMethod()

答案 2 :(得分:0)

这是第一种方法。

  1. 创建一个名为 MethodInfo 的静态类(与 System.Reflection.MethodInfo 同名)。由于您很少需要明确引用原始类型,因此推理相同的名称。但是,您自然会在那里寻找解决方案。

    public static class MethodInfo
    {
        public static System.Reflection.MethodInfo From(Func<string, int> func)
        {
            return func.Method;
        }
    
        // Other members for Action<T>, Action<T1, T2> etc.
        // Other members for Func<T>, Func<T1, T2> etc.
    }
    
  2. 考虑有一个MyClass类,它有MyMethod方法:

    class MyClass
    {
        static int MyMethod(string s) { return default(int); }
    }
    
  3. 使用类及其成员如下(关键部分):

    "The method is called " + MethodInfo.From(MyClass.MyMethod).Name;
    
  4. 这比自我描述更容易使用和简洁:

    "The method is called " + new Func<string, int>(MyClass.MyMethod).Method.Name
    

答案 3 :(得分:0)

目前最好的解决方案:

  1. 创建静态类ReflectionExtensionMethods

    public static class ReflectionExtensionMethods
    
  2. ActionAction<T>等,Func<T>Func<T1, T2>等添加多种方法。以下是Action的示例:

    public static string GetMethodName(this Type @this, Expression<Action> expression)
    {
        return GetMethodNameInternal(@this, expression);
    }
    
  3. 检查给定表达式及其正文是否有效的内部部分:

    private static string GetMethodNameInternal(Type @this, MethodCallExpression bodyExpression)
    {
        if (bodyExpression == null)
            throw new ArgumentException("Body of the exspression should be of type " + typeof(MethodCallExpression).Name);
    
        var member = bodyExpression.Method;
        if (member.MemberType != MemberTypes.Method)
            throw new ArgumentException("MemberType of the exspression should be of type " + MemberTypes.Method);
    
        if (!object.Equals(@this, member.DeclaringType))
            throw new ArgumentException("Invalid property owner.");
    
        return member.Name;
    }
    
  4. 实例成员的用法:

    var owner = new Foo();
    var methodName = typeof(Foo).GetMethodName(() => owner.VoidMethod());
    
  5. 静态成员的用法:

    var methodName = typeof(Foo).GetMethodName(() => Foo.StaticVoidMethod());
    
  6. ReflectionExtensionMethods可以通过返回属性名称和其他成员的方法进一步补充。