是否可以从动作中获取方法名称?我知道我总能传递一个字符串,但我希望能有一些更聪明的东西.
public bool DeviceCommand(Action apiCall)
{
//It would be nice to log the method name that was passed in
try
{
apiCall();
}
catch (Exception exc)
{
LogException(exc);
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
用法如下:
void MyMethod()
(
DeviceCommand(() => api.WriteConfig(config));
)
Run Code Online (Sandbox Code Playgroud)
jer*_*enh 24
就在这里: Action.Method.Name
但是,这仅在将Action参数作为方法组传递而不是作为lambda表达式传递时才有效:
class Program
{
static void SomeActionName(){}
static void Main(string[] args)
{
LogMethodName(() => SomeActionName()); // <Main>b__0
LogMethodName(SomeActionName); // SomeActionName
var instance = new SomeClass();
LogMethodName(() => instance.SomeClassMethod());; // <Main>b__1
LogMethodName(instance.SomeClassMethod); // SomeClassMethod
}
private static void LogMethodName(Action action)
{
Console.WriteLine(action.Method.Name);
}
}
class SomeClass
{
public void SomeClassMethod(){}
}
Run Code Online (Sandbox Code Playgroud)
Aar*_*ron 22
如果您对DeviceCommand的调用始终是形式的
DeviceCommand(() => someObject.SomeMethod(parameters));
Run Code Online (Sandbox Code Playgroud)
然后您可以修改DeviceCommand以将表达式树作为参数.这将允许您深入到树中以获取所需的信息(在本例中为字符串"SomeMethod"),然后将树编译为委托并执行它:
public bool DeviceCommand(Expression<Action> apiCallExp)
{
var methodCallExp = (MethodCallExpression) apiCallExp.Body;
string methodName = methodCallExp.Method.Name;
// do whatever you want with methodName
Action apiCall = apiCallExp.Compile();
try
{
apiCall();
}
catch(Exception exc)
{
LogException(exc);
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
当然,每次构建和编译表达式树都可能是一个主要的性能问题(或者不是 - 它只取决于DeviceCommand调用的频率).在您的情况下,您必须确定性能影响(以及此方法的一般"黑客"是否值得).
| 归档时间: |
|
| 查看次数: |
16118 次 |
| 最近记录: |