我正在尝试做一些相当简单的事情,但不确定是否有任何方法可以简单地创建我的类的虚拟实例。
我试图简单地得到一个非静态方法的方法名称使用一些简单的代码:
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");
}
当然可以这么做。这样使用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
设为公共的,这样我就可以在外面调用它,但是你可以把它设为私有的,在类的静态方法中调用它