如何获取函数

时间:2016-04-05 20:53:07

标签: c# .net vb.net c++-cli

我有一个函数,它接受一个自定义类的对象。此对象的成员应存储该函数的标识符(或该函数的“引用”),以便该函数可以确定之前是否使用此对象调用它。

为此目的,什么是合适的身份? 我不一定在谈论函数名称,因为重载的函数共享相同的名称,所以这不起作用 功能地址(用于委托代理)是否正确?我很确定这会有效,但不是100%肯定。或者,垃圾收集器可以像常规对象一样移动函数吗? 是否有另一种更好的方法可以获得“功能ID”?

修改
这是一个演示我的要求(使用伪代码)的例子:

void WorkerFunction (CFuncStep i_oFS)  
{
  if (i_oFS.FunctionID == WorkerFunction.FunctionID)
  {
    // continue work
  }
  else
  {
    // start work
    i_oFS.FunctionID = WorkerFunction.FunctionID;
  }

  if (finished_work)
    i_oFS.FunctionID = null;
}

目的是保存操作状态,然后继续在被调用函数中操作。这在例如情况下是有意义的该功能进行网络通信,必须等待回复。 func立即返回,以便线程可以执行其他工作。之后又回来取回来了 我可以使用一个单独的线程,但我想在这里避免线程同步的开销,因为它不会只是1添加。线程,但相当一些。

1 个答案:

答案 0 :(得分:0)

@BenVoigt:感谢MethodHandle的提示! 这绝对是我需要的。我在SO帖子&{39; Can you use reflection to find the name of the currently executing method?'

中找到了一个用法示例

这是我的解决方案:

using namespace System::Reflection;

ref class CFuncStep
{
public:
  int               m_iStep;
  MethodBase^       m_oMethod;
  String^           m_sName;
};

void workerfunction (CFuncStep^ i_oFS)
{
  MethodBase^ oMethod = MethodBase::GetCurrentMethod ();

  if (oMethod != i_oFS->m_oMethod)
  {
    i_oFS->m_iStep = 1;
    i_oFS->m_oMethod = MethodBase::GetCurrentMethod ();
    i_oFS->m_sName   = i_oFS->m_oMethod->Name;
  }

  switch (i_oFS->m_iStep)
  {
  case 1:
  case 2:
  case 3:
    i_oFS->m_iStep++;
    break;

  case 4:
    i_oFS->m_iStep = 0;
    i_oFS->m_oMethod = nullptr;
    i_oFS->m_sName   = nullptr;
  }
};

int main()
{
  CFuncStep^ oFS = gcnew CFuncStep;
  do
  {
    workerfunction (oFS);
  }
  while (oFS->m_iStep > 0);

  return 0;
}