c# - 获取静态方法内的非静态方法名称

标签 c# reflection delegates static-methods

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

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

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;
}

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

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

我有一个通用方法:

    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");
        }

最佳答案

你当然可以这样做。使用Expression<Func<YourInstanceClass, TReturn>>像这样:

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 public,这样我就可以在外部调用它,但您可以将其保留为私有(private)并在类内的静态方法中调用它

关于c# - 获取静态方法内的非静态方法名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15774643/

相关文章:

c# - 提供给 .NET 通用构造函数的类型参数,但仍然会导致错误,就好像没有

c# - Windows 8 手机 C# 请求桌面网站无法正常工作

c# - ToDictionary() 是否创建副本或引用?

Java:使用反射转储对象信息时如何避免循环引用?

c# - 是否可以将属性名称作为字符串传递并为其赋值?

objective-c - 问题: Parsing XML File in Objective-C/Cocoa Project for iOS

ios - 使用自定义委托(delegate)时,responsToSelector 始终为 false

c# - 自定义 DateTime 日长

reflection - 在golang中使用reflect打印struct指针字段类型

c# - 编译器为匿名方法生成了不正确的代码 [MS BUG FIXED]