【问题标题】:Get non-static method name inside static method在静态方法中获取非静态方法名称
【发布时间】:2013-04-02 21:22:11
【问题描述】:

我正在尝试做一些相当简单的事情,但不确定是否有任何方法可以简单地创建我的类的虚拟实例。

我正在尝试使用一些简单的代码来简单地获取非静态方法的方法名称:

static string GetMethodName(Func<string, int> function  )
        {
            return function.Method.Name;
        }

但是我试图像这样从 MyStaticMethod 调用它,当然它在抱怨:

private static void MyStaticMethod()
{
   var a = GetMethodName(MyNonStaticMethod);
}


private int MyNonStaticMethod(string param1)
{
  return 0;
}

有没有办法在不创建包含类的虚拟实例的情况下完成此操作?显然我的情况更复杂,我不能简单地将我的非静态方法设为静态(它需要一个实例并具有依赖项绑定)。只是想知道这是否可能,因为我只需要名称(所以真的不需要实例)。我试图摆脱魔术字符串,并希望在事情发生变化时出现一些编译时错误。

编辑:我创建了一个静态助手类

我有一个通用方法:

    public static string GetMemberName<T>(
                Expression<Func<T, object>> expression)
            {
                if (expression == null)
                {
                    throw new ArgumentNullException("expression");
                }

                return _GetMemberName(expression.Body);
            }

private static string _GetMemberName(
            Expression expression)
        {   
            if (expression is MemberExpression)
            {
                var memberExpression =
                    (MemberExpression)expression;
                return memberExpression.Member.Name;
            }

            if (expression is MethodCallExpression)
            {
                var methodCallExpression = (MethodCallExpression)expression;
                return methodCallExpression.Method.Name;
            }

            if (expression is UnaryExpression)
            {
                var unaryExpression = (UnaryExpression)expression;
                return GetMemberName(unaryExpression);
            }

            throw new ArgumentException("Unrecognized expression");
        }

【问题讨论】:

  • 请用相关语言标记
  • 基本上你在问:如何创建一个指向实例方法但没有任何特定实例的Func&lt;string, int&gt; 委托?
  • 好吧..当然,如果我可以通过其他方法获取方法名称,我不需要委托,只是为了清楚起见发布我正在尝试做的事情。我知道你要去哪里,所以很明显,如果有解决方案,它就不能使用实际的实例方法。我真的只想做 MyNonStaticMethod.ToString() !!!

标签: c# reflection delegates static-methods


【解决方案1】:

你当然可以这样做。像这样使用Expression&lt;Func&lt;YourInstanceClass, TReturn&gt;&gt;:

static string GetMethodName<TReturn>(Expression<Func<YourInstanceClass, TReturn>> function)
{
    var call = function.Body as MethodCallExpression;
    return call != null ? call.Method.Name : "not a single call expression";
}

现在可以

var name = GetMethodName(a => a.MyNonStaticMethod("1"));

Console.WriteLine (name); //prints MyNonStaticMethod

在哪里

public class YourInstanceClass
{
    public int MyNonStaticMethod(string param1)
    {
        return 0;
    }
}

我已将MyNonStaticMethod 设为公开,以便我可以在外部调用它,但您可以将其保留为私有并在类内部的静态方法中调用它

【讨论】:

  • 哈!感谢您不称我为哑巴**(正如其他回复似乎暗示的那样)。是的,这正是我想要做的。我需要复习一下我的表情树知识,感谢您的正确理解!
  • 请注意,这需要创建虚拟参数(与类的虚拟实例相反)。如果您仍然想在原始方法中使用类的虚拟实例,则可以使用 @987654321 @ 创建实例而不运行构造函数或初始化任何字段。
  • @DanBryant 感谢您的注意。在两个邪恶之间进行选择 - 虚拟参数和未初始化的对象,我会首先选择。但无论如何,谢谢你的注意
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多