我有一个如下所示的课程:
public class MyClass
{
...
protected void MyMethod()
{
...
string myName = System.Reflection.MethodBase.GetCurrentMethod.Name;
...
}
...
}
myName
的值是“MyMethod”。
有没有办法可以使用Reflection来获取myName
的“MyClass.MyMethod”值?
答案 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());
}
}