使用System.Reflection获取方法的全名

时间:2010-06-03 17:31:30

标签: c# .net reflection

我有一个如下所示的课程:

public class MyClass
{

...

    protected void MyMethod()
    {
    ...
    string myName = System.Reflection.MethodBase.GetCurrentMethod.Name;
    ...
    }

...

}

myName的值是“MyMethod”。

有没有办法可以使用Reflection来获取myName的“MyClass.MyMethod”值?

8 个答案:

答案 0 :(得分:61)

您可以查看从ReflectedType获得的MethodBase的{​​{1}},即

GetCurrentMethod

答案 1 :(得分:19)

并使用参数获取完整的方法名称:

var method = System.Reflection.MethodBase.GetCurrentMethod();
var fullName = string.Format("{0}.{1}({2})", method.ReflectedType.FullName, method.Name, string.Join(",", method.GetParameters().Select(o => string.Format("{0} {1}", o.ParameterType, o.Name)).ToArray()));

答案 2 :(得分:6)

扩展Ruben,你可以得到这样的全名:

var info = System.Reflection.MethodBase.GetCurrentMethod();
var result = string.Format(
                 "{0}.{1}.{2}()",
                 info.ReflectedType.Namespace,
                 info.ReflectedType.Name,
                 info.Name);

您可以将其添加到接收MethodBase参数的静态方法并生成字符串。

答案 3 :(得分:6)

我想现在最好这样做:

string fullMethodName = $"{typeof(MyClass).FullName}.{nameof(MyMethod)}";

答案 4 :(得分:4)

你可以得到这样的全名:

var fullMethodName = System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName;

答案 5 :(得分:4)

在C#6中,您可以使用nameof

string myName = nameof(MyMethod);

答案 6 :(得分:2)

感谢上面的帖子,他们帮助我为MVC 4 HTMLHelpers创建了一个强大的类型绑定系统,如下所示。

 public static MvcHtmlString StrongTypeBinder(this HtmlHelper htmlhelper, Expression<Func<object, string>> SomeLambda)
    {
        var body = SomeLambda.Body;
        var propertyName = ((PropertyInfo)((MemberExpression)body).Member).Name;
        HtmlString = @"
            <input type='text' name='@Id' id='@Id'/>
            ";
        HtmlString = HtmlString.Replace("@Id", propertyName);
        var finalstring = new MvcHtmlString(HtmlString);
        return finalstring;

    }

在任何CSHTML视图中使用上述代码:

@Html.StrongTypeBinder(p=>Model.SelectedDate)

这允许我将ViewModel中的任何属性绑定到我想要的任何HTML元素类型。在上面的示例中,我绑定了用户进行选择后发回的所选数据的名称字段。回发后的视图模型会自动显示所选值。

答案 7 :(得分:0)

在异步方法中运行时,您会遇到问题。以下是解决这个问题的方法:

如果您需要完全限定班级名称,则必须使用DeclaringType.FullName代替DeclaringType.Name

这段代码不适用于匿名或lambda方法。

static string GetMethodContextName() {
    var name = new StackTrace().GetFrame(1).GetMethod().GetMethodContextName();
}

static string GetMethodContextName(this MethodBase method) {
    if (method.DeclaringType.GetInterfaces().Any(i => i == typeof(IAsyncStateMachine))) {
        var generatedType = method.DeclaringType;
        var originalType = generatedType.DeclaringType;
        var foundMethod = originalType.GetMethods(Instance | Static | Public | NonPublic | DeclaredOnly)
            .Single(m => m.GetCustomAttribute<AsyncStateMachineAttribute>()?.StateMachineType == generatedType);
        return foundMethod.DeclaringType.Name + "." + foundMethod.Name;
    } else {
        return method.DeclaringType.Name + "." + method.Name;
    }
}

以下是一个示例用法:

class Program { 
    static void Main(string[] args) {
        // outputs Program.Main
        Console.WriteLine(GetMethodContextName());
    }
}