Ответ 1
Если ваши вызовы DeviceCommand всегда будут иметь вид
DeviceCommand(() => someObject.SomeMethod(parameters));
то вы можете изменить 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;
}
Конечно, создание и компиляция дерева выражений каждый раз может быть серьезной проблемой производительности (или нет - это просто зависит от того, как часто вызывается DeviceCommand
). Вам придется решить, стоит ли влиять на производительность (и общая "взломать" ишемию этого подхода) в вашей ситуации.