0

假设有一个静态的 .Net 方法

static void RegisterDelegate(Action<array<Object^>^>^ handler);

在我们无法修改的某些程序集中定义。

我确实有以下代码:

static void HandleCallback(Action<array<Object^>^>^ handler, NATIVE_CPP_TYPE *nativeObject){
    //some code here
}

static void TestCall(NATIVE_CPP_TYPE *nativeObject){
    //RegisterDelegate(??);
}

whereNATIVE_CPP_TYPE是一些不可序列化且仅本机的类型,也无法修改。

调用TestCall(ptrToObj)现在应该创建一个类型的委托Action<array<Object^>^>。这个委托应该在被调用HandleCallback时调用并传递它自己的参数(对象数组)和指向最初传递给TestCall函数的本机对象的指针。因此,指针需要存储在某种闭包中。

你知道如何做到这一点吗?我考虑过System::Linq::Expressions命名空间,但是我不能用那种表达式封装原生对象。

提前致谢!

4

1 回答 1

2

据我所知,在 C++/CLI 中你不能做托管 lambdas。当然,您可以创建自己的类来存储本机类型,然后公开一个用作委托的方法:

public ref class ManagedClass
{
    static void RegisterDelegate(Action<array<Object^>^>^ handler)
    {

    }
};

class NATIVE_CPP_TYPE
{

};

static void HandleCallback(array<Object^>^ handler, NATIVE_CPP_TYPE *nativeObject)
{     
    //some code here 
}  

public ref class HandleCallbackWithNativeType
{
    NATIVE_CPP_TYPE * m_pNativeObject;

public:
    HandleCallbackWithNativeType(NATIVE_CPP_TYPE *nativeObject)
    {
        m_pNativeObject = nativeObject;
    }

    void Execute(array<Object^>^ array)
    {
        HandleCallback(array, m_pNativeObject);
    }
};


static void TestCall(NATIVE_CPP_TYPE *nativeObject)
{
    // This type will act as your closure "capturing" nativeObject.
    HandleCallbackWithNativeType ^ pHandler = gcnew HandleCallbackWithNativeType(nativeObject);
    Action<array<Object^>^>^ handler = gcnew Action<array<Object^>^>(pHandler, &HandleCallbackWithNativeType::Execute);
} 

它不像 lambda 语法那样方便,但它可以完成这项工作。

于 2012-06-29T12:50:50.253 回答