【发布时间】: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<string, int>委托? -
好吧..当然,如果我可以通过其他方法获取方法名称,我不需要委托,只是为了清楚起见发布我正在尝试做的事情。我知道你要去哪里,所以很明显,如果有解决方案,它就不能使用实际的实例方法。我真的只想做 MyNonStaticMethod.ToString() !!!
标签: c# reflection delegates static-methods