C# 如何获取函数的唯一标识符

C# 如何获取函数的唯一标识符,c#,.net,vb.net,c++-cli,C#,.net,Vb.net,C++ Cli,我有一个函数,它接受一个自定义类的对象。此对象的成员应存储该函数的标识符(或该函数的“引用”),以便该函数可以确定以前是否使用此对象调用过它 用于此目的的合适标识符是什么? 我不是说函数名,因为重载函数共享相同的名称,所以这不起作用。 函数地址(如für委托所用)是否正确?我很肯定这会奏效,但不是100%肯定。或者该函数可以像普通对象一样由垃圾收集器移动吗? 是否有其他更好的方法来获取“函数ID” 编辑 下面是一个示例来演示我的需求(使用伪代码): 其目的是保存操作状态,然后在调用的函数中继续操

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

用于此目的的合适标识符是什么?
我不是说函数名,因为重载函数共享相同的名称,所以这不起作用。
函数地址(如für委托所用)是否正确?我很肯定这会奏效,但不是100%肯定。或者该函数可以像普通对象一样由垃圾收集器移动吗?
是否有其他更好的方法来获取“函数ID”

编辑
下面是一个示例来演示我的需求(使用伪代码):

其目的是保存操作状态,然后在调用的函数中继续操作。这在功能进行网络通信并且必须等待回复的情况下是有意义的。func立即返回,以便线程可以执行其他工作。稍后它会返回以获取回复。

我可以使用一个单独的线程,但是我想避免线程同步的开销,因为它不仅仅是一个add。线程,但相当多。

@BenVoigt:感谢您对
MethodHandle
的提示
这绝对是我需要的。我在SO post“”上找到了一个用法示例

以下是我的解决方案:

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;
}

@BenVoigt:感谢您对
MethodHandle
的提示
这绝对是我需要的。我在SO post“”上找到了一个用法示例

以下是我的解决方案:

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;
}

如果没有更多的上下文,很难说最好的方法,但在大多数情况下,我建议不要让类的成员以这种方式了解函数的其他知识。函数需要知道它们以前是否在这个对象上被调用过,这是出于什么目的?寻找oracle是一个相当糟糕的主意。只需使用枚举即可。MethodHandle应满足您的要求requirements@BenVoigt:我可以从方法本身内部获得该方法的句柄吗?如果没有更多的上下文,很难说最好的方法,但在大多数情况下,我建议不允许类的成员以这种方式拥有函数的其他知识。函数需要知道它们以前是否在这个对象上被调用过,这是出于什么目的?寻找oracle是一个相当糟糕的主意。只需使用枚举即可。MethodHandle应满足您的要求requirements@BenVoigt:我可以从方法本身内部获取该方法的句柄吗?