-2

我想将数学名称放入字符串中,但我也不想使用硬编码值。相反,我想通过反射动态获取名称。我使用了以下工作声明:

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

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

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


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

4

4 回答 4

2

MethodInfo.CurrentMethod应该给你当前方法的名称

"The method is called " + MethodInfo.GetCurrentMethod().Name;
于 2013-08-14T11:48:55.863 回答
1

使用 MethodBase.GetCurrentMethod()

于 2013-08-14T11:51:23.527 回答
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
    
于 2013-08-14T14:12:07.127 回答
0

目前最好的解决方案:

  1. 创建静态类ReflectionExtensionMethods

    public static class ReflectionExtensionMethods
    
  2. Action为、Action<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());
    

ReflectionExtensionMethods可以通过返回属性和其他成员名称的方法进一步补充。

于 2013-08-19T07:51:26.380 回答