我想将一个mathod名称放入一个字符串中,但我也不想使用硬编码值。相反,我想通过反思动态地获得名称。我使用了以下工作声明:
"The method is called " + new Action(MyMethod).Method.Name;
我认为创建Action
委托在语义上是不合适的。它建议会有一个方法调用,但相反,会有一个反射。我正在为类寻找类似 typeof 运算符或 GetType 的东西,但是在方法级别。
模式Delegate.Method.Name
是否是实现目标的最佳和标准方法?
我的意思是非当前的方法。
答案 0 :(得分:2)
MethodInfo.CurrentMethod应该为您提供当前方法的名称
"The method is called " + MethodInfo.GetCurrentMethod().Name;
答案 1 :(得分:1)
使用MethodBase.GetCurrentMethod()
答案 2 :(得分:0)
这是第一种方法。
创建一个名为 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.
}
考虑有一个MyClass类,它有MyMethod方法:
class MyClass
{
static int MyMethod(string s) { return default(int); }
}
使用类及其成员如下(关键部分):
"The method is called " + MethodInfo.From(MyClass.MyMethod).Name;
这比自我描述更容易使用和简洁:
"The method is called " + new Func<string, int>(MyClass.MyMethod).Method.Name
答案 3 :(得分:0)
目前最好的解决方案:
创建静态类ReflectionExtensionMethods
:
public static class ReflectionExtensionMethods
为Action
,Action<T>
等,Func<T>
,Func<T1, T2>
等添加多种方法。以下是Action
的示例:
public static string GetMethodName(this Type @this, Expression<Action> expression)
{
return GetMethodNameInternal(@this, expression);
}
检查给定表达式及其正文是否有效的内部部分:
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;
}
实例成员的用法:
var owner = new Foo();
var methodName = typeof(Foo).GetMethodName(() => owner.VoidMethod());
静态成员的用法:
var methodName = typeof(Foo).GetMethodName(() => Foo.StaticVoidMethod());
ReflectionExtensionMethods
可以通过返回属性名称和其他成员的方法进一步补充。