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:我可以从方法本身内部获取该方法的句柄吗?